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
不断的压栈弹栈就可以了,不过有几个小地方需要学习一下。
1. atoi函数:把字符串转换成整型数。ASCII to integer 的缩写。
原型:
int atoi(const char *nptr);
参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。
头文件: #include <stdlib.h>
2. c_str()函数
string.c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。
3.考虑压栈的顺序,如a/b和a-b操作,先弹出的是b,后弹出的是a ,注意顺序
代码:
#include <iostream> #include <cstring> #include <vector.h> #include <stack.h> using namespace std; //["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 //["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6 int evalRPN(vector<string> & tokens ){ stack<int> op; int s = tokens.size(); //vector<string>::iterator iter = tokens.begin();//迭代器 int a ,b; for(int i=0;i<s;i++){ if(tokens[i] == "+"){ a = op.top(); op.pop(); b = op.top(); op.pop(); op.push(a+b); }else //之前没有这个else就有问题 if(tokens[i] == "-"){ a = op.top(); op.pop(); b = op.top(); op.pop(); op.push(b-a); }else//之前没有这个else就有问题 if(tokens[i] == "*"){ a = op.top(); op.pop(); b = op.top(); op.pop(); op.push(a*b); }else//之前没有这个else就有问题 if(tokens[i] == "/"){ a = op.top(); op.pop(); b = op.top(); op.pop(); op.push(b/a); //different } else {// is a number op.push(atoi(tokens[i].c_str())); //这里之前用迭代器做,就这个位置中出错 //op.push(atoi(*iter.c_str())); //error } } return op.top(); } int main() { vector<string> s ; s.push_back("2"); s.push_back("1"); s.push_back("+"); s.push_back("3"); s.push_back("*"); cout<<evalRPN(s); return 0; }