Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
逆波兰式算法(后缀表达式),在求解过程中,注意区分‘-’减法运算和负数
int evalRPN(vector<string> &tokens) { vector<string> v=tokens; stack<int> stak; int a; char *c; char ch; int op1; int op2; vector<string>::iterator it=v.begin(); while(it!=v.end()) { a=atoi((*it).c_str()); c=const_cast<char*>((*it).c_str()); ch=c[0]; //int a=atoi("-1") 则a<0;如果 a=atoi("-") 则a=0用以区分减法还是负号 if(ch>='0'&&ch<='9') stak.push(a); else if(a<0) stak.push(a); else if(ch=='+'||ch=='-'||ch=='*'||ch=='/') { switch (ch){ case '+': op2=stak.top(); stak.pop(); op1=stak.top(); stak.pop(); op1=op1+op2; stak.push(op1); break; case '-': op2=stak.top(); stak.pop(); op1=stak.top(); stak.pop(); op1=op1-op2; stak.push(op1); break; case '*': op2=stak.top(); stak.pop(); op1=stak.top(); stak.pop(); op1=op1*op2; stak.push(op1); break; case '/': op2=stak.top(); stak.pop(); op1=stak.top(); stak.pop(); if(op2!=0){ op1=op1/op2; stak.push(op1);} else cout<<"/ error!"<<endl; break; default: cout<<"error"<<endl; } } it++; } return stak.top(); }