Evaluate Reverse Polish Notation - LeetCode 150

题目描述:
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
Hide Tags Stack

分析:
逆波兰式的计算规则如下:
如果是操作数,则直接压入栈中,如果是运算符,则从栈中弹出两个操作数进行运算后,将结果入栈。
本题的逆波兰是的字符串数组,因此需要注意将字符串转换为整数,同时要注意负数的转换。

以下是C++实现代码

/*16ms//*/
class Solution {
public:
 bool isOp(string s) //判断是否为运算符
    {
        if(s == "+" || s == "-" || s == "*" || s == "/")
            return true;
        return false;
    }
    int stoi(string s) //将字符串转换为整数,注意负数
    {
	int flag = 1;
	int i = 0,num = 0;	
	if(s[0] == '-')
	{
	    flag = -1; //标记负数
	    i++;				
	} 
        while(i < s.size())
	{			
	    if(isdigit(s[i]))
		num = num * 10 + (s[i++] - '0');
	}		
        return flag * num;
    }

    int doOp(int a,int b,string op) //进行a op b运算
    {
        if(op == "+")
            return a + b;
        else if(op == "-")
            return a - b;
        else if(op == "*")
            return a * b;
        else if(op == "/")
            return a / b;		
        else ;
    }
    int evalRPN(vector<string>& tokens) {
        int len = tokens.size();
        //if(len == 1)
        //    return stoi(tokens[0]);
            
        stack<int> s;
        int i = 0;
		int num = 0;
        for(; i < len; i++)
        {
            if(!isOp(tokens[i]))
            {
                num = stoi(tokens[i]); //将操作数入栈
                s.push(num);
            }
            else //如果是运算符,就从栈中弹出两个操作数,运算后将结果入栈
            {
                int a = 0,b = 0;
                b = s.top();
                s.pop();
                a = s.top();
                s.pop();
                s.push(doOp(a,b,tokens[i]));
            }
        }
        return s.top(); //最后栈里只有一个元素,就是最终结果
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值