给一个用字符串表示的表达式数组,求出这个表达式的值。
提示:
表达式只包含整数, +, -, *, /, (, ).
示例:
对于表达式 (2*6-(23+7)/(1+2)), 对应的数组为:
[
“2”, “*”, “6”, “-“, “(“,
“23”, “+”, “7”, “)”, “/”,
(“, “1”, “+”, “2”, “)”
],
其值为 2
思想:
还是先构造后缀表达式,再利用后缀表达式进行求值。
#ifndef C368_H
#define C368_H
#include<iostream>
#include<vector>
#include<string>
#include<stack>
using namespace std;
class Solution {
public:
/*
* @param expression: a list of strings
* @return: an integer
*/
int evaluateExpression(vector<string> &expression) {
// write your code here
vector<string> post = postExpression(expression);
stack<string> sk;
for (auto c : post)
{
if (string("+-*/").find(c) != string::npos)
{
int num = 0;
string x = sk.top();
int xint = atoi(x.c_str());
sk.pop();
string y = sk.top();
sk.pop();
int yint = atoi(y.c_str());
if (c == "+")
num = yint + xint;
else if (c == "-")
num = yint - xint;
else if (c == "*")
num = yint*xint;
else
{
if (xint == 0)
{
return 0;
break;
}
else
num = yint / xint;
}
sk.push(to_string(num));
}
else
sk.push(c);
}
if (sk.empty())
return 0;
else
{
string s = sk.top();
return atoi(s.c_str());
}
}
int getPriority(string s)
{
if (s == "(")
return 0;
else if (s == "+" || s == "-")
return 1;
else if (s == "*" || s == "/")
return 2;
else
return 3;
}
vector<string> postExpression(vector<string> &expression)
{
vector<string> post;
stack<string> sk;
for (auto c : expression)
{
if (c == "(")
sk.push(c);
else if (c == ")")
{
while (sk.top() != "(")
{
post.push_back(sk.top());
sk.pop();
}
sk.pop();
}
else
{
if (string("+-*/").find(c) == string::npos)
sk.push(c);
else
{
while (!sk.empty() && getPriority(sk.top()) >= getPriority(c))
{
post.push_back(sk.top());
sk.pop();
}
sk.push(c);
}
}
}
while (!sk.empty())
{
post.push_back(sk.top());
sk.pop();
}
return post;
}
};
#endif