如何用程序实现逆波兰表达式值算法问题

今天在网上碰到一个算法类题目,用程序实现计算逆波兰表达式值。

什么是逆波兰表达式呢?在网上搜了一下,后缀表达式就是从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,得到的计算结果就是表达式的值。例如

 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

那么如何用程序实现呢?代码如下:

#include <string>
#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
int eval_expression(vector<string> &tokens, int& pt)
{
string s = tokens[pt];

if(s == "+" || s == "-" || s == "*" || s== "/") // tokens[r] is an operator
{
pt--;
int v2 = eval_expression(tokens, pt);
pt--;
int v1 = eval_expression(tokens, pt);
if(s == "+")
return v1 + v2;
else if(s == "-")
return v1 - v2;
else if(s == "*")
return v1 * v2;
else
return v1 / v2;
}
else // tokens[r] is a number
{
return atoi(s.c_str());
}
}

int evalRPN(vector<string> &tokens) {
int pt = tokens.size()-1;
return eval_expression(tokens, pt);
}
};

void main()
{
int result;
vector<string> token;
token.push_back("4");
token.push_back("13");
token.push_back("5");
token.push_back("/");
token.push_back("+");
Solution a;
result=a.evalRPN(token);
cout<<result<<endl;
}

运行后计算结果为6,符合要求。

这里只验证了一个结果,要验证其他结果需要改main()函数里面容器的数据。算法的核心思想使用了递归的算法。首先找到第一个运算符号,计算结果,再依次从左往右寻找运算符号,计算符号前面的两个数的运算结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值