[LeetCode] eva luate Reverse Polish Notation

2014-11-24 11:34:50 · 作者: · 浏览: 0

eva luate 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
问题描述:给定一个逆波兰式,对这个逆波兰式求值。

问题应该是很简单的,用栈嘛,记得学栈的时候,逆波兰式还是栈的典型应用呢!

遍历字符串向量,当当前字符串是整数时就将整数存到栈中,如果当前字符串是操作符就弹出栈顶的两个元素,然后进行计算,将结果再存到栈中,直到结束。

class Solution {
public:
int cal(int l, int r, char op)
	{
		switch(op) {
		case '+':
			return l + r;
		case '-':
			return l - r;
		case '*':
			return l * r;
		case '/':
			return l / r;
		default:
			return -1;
		}
	}

    int eva lRPN(vector
  
    &tokens)
	{
		stack
   
     data; vector
    
     ::iterator iter = tokens.begin(); while(iter != tokens.end()) { if(isdigit((*iter)[0]) || iter->size() > 1) { data.push(atoi(iter->c_str())); } else { int r = data.top(); data.pop(); int l = data.top(); data.pop(); int res = cal(l, r, (*iter)[0]); data.push(res); } ++iter; } if(!data.empty()) return data.top(); else return -1; } };
    
   
  

中间判断遍历的字符串是否是数字的表达式:isdigit((*iter)[0]) || iter->size() > 0是看别人的,开始我用的是isdigit((*iter)[0]),但是不能正常的判断负数,就自己写了一个函数用来判断给定的字符串是否是整数:

        bool isdata(string str)
	{
		string::iterator iter = str.begin();
		if(*iter == '-') {
			++iter;
		}

		while(iter != str.end() && isdigit(*iter))
			++iter;
		if(iter == str.end()) {
			return true;
		}
		else {
			return false;
		}
	}

不过这样会导致Runtime Error,不知道为什么,这个判断的函数应该更精准呀!