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 标签:stack;这个问题是个后缀表达式问题,用stack堆栈来解决最简单有效。遇到数就将其压入堆栈,遇到运算符号就从栈顶取出两个数字参与运算。但是,要注意一个问题,每次弹出的两个数,其正确的运算顺序应该是后弹出的数在前,先弹出的数在后。举例说明:0 3 /弹出的时候是3先弹出,0次之,本来是0/3,如果没有按照正确的顺序,就变成了3/0,程序就会因为出现严重错误而崩溃了!感觉这个题目很简单,但是因为上述的问题搞了很久才弄好,在编程之前,一定要多思考再动手!
贴出代码:
1 int istoken(string s){ 2 if(s.compare("+")==0) 3 return 1; 4 if(s.compare("-")==0) 5 return 2; 6 if(s.compare("*")==0) 7 return 3; 8 if(s.compare("/")==0) 9 return 4; 10 return -1; 11 }//不同的返回值对应不同的情况 12 int transform(string s){ 13 return atoi(s.c_str());//将string转换为int 14 } 15 class Solution { 16 public: 17 int evalRPN(vector<string> &tokens) { 18 int len=tokens.size(); 19 int i; 20 stack<int>end; 21 for(i=0;i<len;i++){ 22 if(istoken(tokens[i])==-1){//将数压入堆栈 23 end.push(transform(tokens[i])); 24 } 25 else{ 26 int n1=end.top(); 27 end.pop(); 28 int n2=end.top(); 29 end.pop();//这里n1,n2交换了顺序 30 switch(istoken(tokens[i])){ 31 case 1:{n1+=n2;break;} 32 case 2:{n1-=n2;break;} 33 case 3:{n1*=n2;break;} 34 case 4:{n1/=n2;break;} 35 } 36 end.push(n1); 37 } 38 39 } 40 return end.top(); 41 } 42 };
时间: 2024-10-05 10:07:44