简易实现后缀表达式

来源:互联网 发布:360怎么禁止软件联网 编辑:程序博客网 时间:2024/05/20 15:57

    同样为栈的应用程序之一,关于后缀表达式的概念我们不在赘述,直接来实现。

enum OPERATOR  //这个枚举类型是为了更好的存储数据建立的{ADD,SUB,MUL,DIV,DATA};class Cell{public:Cell(OPERATOR op,int DATA):_op(op),data(DATA){}OPERATOR _op;int data;};int CalcRPN(Cell* RPN, int size){int i = 0;stack<int> s;             //在这里我们同样是建立了一个栈来进行数据的存储for (i = 0; i < size; i++){if (RPN[i]._op == DATA)              //在这里判断,如果此类型是data,我们就将数据压入栈内{s.push(RPN[i].data);}else                       //其他情况的话就代表这个数据是一个运算符,我们就进行相应的操作{int left = 0;     //如果读取到一个运算符的话,我们就将栈顶的第一元素拿出来作为右边的数值,第二个元素拿出来作为左参数进行运算          
int right = 0;                    //运算结束后,将所得结果压入栈内,做后续运算right = s.top(); s.pop();left = s.top();s.pop();switch (RPN[i]._op){case ADD:s.push(right + left);break;case SUB:s.push(left - right);break;case MUL:s.push(right * left);break;case DIV:if (right == 0){cout << "除数为零,算式错误!" << endl;assert(0);}s.push(left / right);break;default:assert(0);break;}}}return s.top();    //最后我们将栈顶元素返回,即为所求结果}
这个实现是极为简单的,不考虑括号等优先级的问题,只进行最简单的运算,接下来我们来试验下它是否正确

int main()//12*(3+4)-6+8/2              //我们给出的式子所得结果应该为82{Cell RPN[] = { {DATA,12}, {DATA,3},{DATA,4},{ADD,0},{MUL,0},{DATA,6},{SUB,0},{DATA,8},{DATA,2},{DIV,0},{ADD,0} };int size = sizeof(RPN) / sizeof(RPN[0]);cout << CalcRPN(RPN, size) << endl;getchar();return 0;} 



这就是一个简易后缀表达式的实现。