力扣编程题分析(150):逆波兰表达式求值

8 篇文章 0 订阅
8 篇文章 0 订阅

题目描述
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
在这里插入图片描述
思路:波兰表达式又称后缀表达式,后缀表达式求值过程如下:
规则:从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到字符就将栈顶的两个数据出栈,进行运行,运算结果进栈,一直到最终获得结果。
例: 9 3 1 - 3 * + 10 2 / + 以此表达式为例,初始化一个空栈,后缀表达式前三个都是数字,所有9 3 1 进栈,如下图:
在这里插入图片描述
接着是“-”,所以栈中的1作为减数,3出栈作为被减数,并运算 3-1得到2,再将2入栈,然后是数字 3 入栈,如下图:
在这里插入图片描述
后面是" * “,也就是意味着栈中的3和2 出栈,并相乘,得到6,并将6进栈,下面是“+”,所以栈中6和9出栈,9与6相加,得到15,将15进栈,如下图:
在这里插入图片描述
接着是10与2连个数字进栈,接下来是”/",栈顶的2与10出栈,,10与2相除,得到5,,将5进栈,如下图:
在这里插入图片描述
最后一个是“+”,所以15与5出栈并相加,得到20,将20进栈,结果20出栈,栈变为空,(终于完事了),如下图:

在这里插入图片描述

class Solution {
public:
    int evalRPN(vector<string>& tokens)
    {
        stack<int> numbers;
        int left = 0, right = 0;
        for (int i = 0; i < tokens.size(); ++i)
        {
        	//如果字符是运算符,则出栈并且运算,最后再入栈
            if (tokens[i][1]=='\0' && (tokens[i][0]=='+' || tokens[i][0]=='-' || tokens[i][0]=='*' || tokens[i][0]=='/'))
            {
                right = numbers.top();
                numbers.pop();
                left = numbers.top();
                numbers.pop();
                switch (tokens[i][0])
                {
                case '+': numbers.push(left + right); break;
                case '-': numbers.push(left - right); break;
                case '*': numbers.push(left * right); break;
                case '/': numbers.push(left / right); break;
                default : break;
                }
            }
            //如果字符不是运算符,将字符串转换为int类型,然后入栈
            else
            {
                numbers.push(atoi(tokens[i].c_str()));
            }
            
        }
        return numbers.top();
    }
};

注意:string 是C++ STL定义的类型,atoi是 C 语言的库函数,所以要先转换成 char* 类型才可以用 atoi。所以我们在本程序中需要这样调用atoi函数:atoi(tokens[i].c_str())。string的函数c_str()是获取这个字符串的首指针,例如: string str = “1234”;那么 char* pStr = str.c_str(); 中 pStr就是指向"1234"字串的首元素的地址 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值