zoukankan      html  css  js  c++  java
  • Infix expressions 中缀表达式

    中缀表达式的计算

    利用两个栈来实现,操作数栈,操作符栈

    只支持个位数运算

    最后必须输入一个'#'

    #include<iostream>
    using namespace std;
    
    template<typename ElementType>
    struct Node
    {
    	ElementType data;
    	Node<ElementType>* next;
    };
    
    template<typename ElementType>
    class LinkStack
    {
    public:
    	LinkStack()
    	{
    		top = new Node<ElementType>;
    		top = NULL;
    	}
    	~LinkStack()
    	{
    		delete top;
    	}
    	void push(ElementType item);
    	void pop();
    	ElementType front() const;
    private:
    	Node<ElementType>*top;
    };
    
    template<typename ElementType>
    void LinkStack<ElementType>::push(ElementType item)
    {
    	Node<ElementType>*p = new Node<ElementType>;
    	p->data = item;
    	p->next = top;
    	top = p;
    }
    
    template<typename ElementType>
    void LinkStack<ElementType>::pop()
    {
    	Node<ElementType>*p = top;
    	top = top->next;
    	delete p;
    }
    
    template<typename ElementType>
    ElementType LinkStack<ElementType>::front()const
    {
    	return top->data;
    }
    
    bool isNum(char c)
    {
    	return (c <= '9' && c >= '0');
    }
    
    char Precede(char f, char c)
    {
    	if (f == '+')
    	{
    		if (c == '*' || c == '/' || c == '(')return '<';
    		else return '>';
    	}
    	else if (f == '-')
    	{
    		if (c == '*' || c == '/' || c == '(')return '<';
    		else return '>';
    	}
    	else if (f == '*')
    	{
    		if (c == '(')return '<';
    		else return'>';
    	}
    	else if (f == '/')
    	{
    		if (c == '(')return '<';
    		else return'>';
    	}
    	else if (f == '(')
    	{
    		if (c == ')')return '=';
    		else return '<';
    	}
    	else if (f == ')')return '>';
    	else if (f == '#')
    	{
    		if (c == '#')return '=';
    		else return '<';
    	}
    }
    
    int Operator(int a, int b, LinkStack<char>* L)
    {
    	if (L->front() == '+')
    		return a + b;
    	else if (L->front()== '-')
    		return a - b;
    	else if (L->front() == '*')
    		return a*b;
    	else if (L->front() == '/')
    		return a / b;
    }
    
    void evaluate(LinkStack<char>*SOPTR, LinkStack<int>*SOPND)
    {
    	SOPTR->push('#');
    	char c;
    	cin >> c;
    	while (c != '#' || SOPTR->front() != '#')
    	{
    		if (isNum(c))
    		{
    			int n = c - '0';
    			SOPND->push(n);
    			cin >> c;
    		}
    		else
    		{
    			switch (Precede(SOPTR->front(), c))
    			{
    			case '<':SOPTR->push(c);
    				cin>>c;
    				break;
    			case '=':SOPTR->pop();
    				cin >> c;
    				break;
    			case '>':
    				int a = SOPND->front();
    				SOPND->pop();
    				int b = SOPND->front();
    				SOPND->pop();
    				SOPND->push(Operator(a, b, SOPTR));
    				SOPTR->pop();
    			}
    		}
    	}
    	cout << SOPND->front() << endl;
    	delete SOPND, SOPTR;
    }
    
    int main()
    {
    	cout << "input the infix expression:(you must input # to stop input)" << endl;
    	LinkStack<char>* SOPTR = new LinkStack<char>;
    	LinkStack<int>* SOPND = new LinkStack<int>;
    	evaluate(SOPTR,SOPND);
    
    	return 0;
    }
  • 相关阅读:
    澳洲中产收入水平[转]
    [转载]在澳洲做IT人士的收入差别
    取消excel 工作保护 密码的宏
    SAP ML 物料分类账详解(含取消激活物料帐方法)
    ABAP--如何创建自定义打印条码
    SAP 产品条码WMS结合 以及ABAP script的集成 BarCode
    SAP 以工序为基准进行发料 机加工行业 Goods Issue to Routing
    SAP HR模块的基础数据表和增强配置
    SAP财务供应链与金库管理的联系与区别
    评点SAP HR功能及人力资源管理软件
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5918423.html
Copyright © 2011-2022 走看看