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

来源:互联网 发布:淘宝售假扣2分多久清零 编辑:程序博客网 时间:2024/05/28 18:43

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

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

 ["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
原创粉丝点击