class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(string s) {
// write code here
//首先中缀表达式转后缀表达式
stack<char> st1;//用来转化为后缀表达式的栈
string hzh = "";//用来存放后缀表达式的变量
for(int i = 0; i < s.length(); i++){
char c = s.at(i);
if(c == '('){//'('直接压入栈
//分隔数字
if(!hzh.empty() && hzh.back() >= '0' && hzh.back() <= '9'){
hzh.push_back('#');
}
st1.push(c);
}
else if(c == ')'){//是')'则弹出栈内所有操作符并加入后缀表达式直到弹出'('(弹出)为止 //分隔数字
if(!hzh.empty() && hzh.back() >= '0' && hzh.back() <= '9'){
hzh.push_back('#');
}
while(!st1.empty()){
char tmp = st1.top();
st1.pop();
if(tmp == '('){
break;
}
else{
hzh.push_back(tmp);
}
}
}
else if(c == '*'){//是'*'则直接入栈
//分隔数字
if(!hzh.empty() && hzh.back() >= '0' && hzh.back() <= '9'){
hzh.push_back('#');
}
st1.push(c);
}
else if(c == '+' || c == '-'){//是加减号则弹出所有运算符直到'('(不弹出)为止 //分隔数字
if(!hzh.empty() && hzh.back() >= '0' && hzh.back() <= '9'){
hzh.push_back('#');
}
while(!st1.empty()){
char tmp = st1.top();
if(tmp == '('){
break;
}
else{
hzh.push_back(tmp);
}
st1.pop();
}
st1.push(c);
}
else{
hzh.push_back(s.at(i));
}
}
while(!st1.empty()){
char c = st1.top();
if(!hzh.empty() && hzh.back() >= '0' && hzh.back() <= '9'){
hzh.push_back('#');
}
hzh.push_back(c);
st1.pop();
}
//后缀表达式求值
stack<int> st2;
string tmp = "";//存储提取的单个操作数
for(int i = 0; i < hzh.length(); i++){
char c = hzh.at(i);
if(c == '#'){//压入操作数,重置tmp
int tmp_i = stoi(tmp);
st2.push(tmp_i);
tmp = "";
}
else if(c == '+'){
int y = st2.top();
st2.pop();
int x = st2.top();
st2.pop();
int r = x + y;
st2.push(r);
}
else if(c == '-'){
int y = st2.top();
st2.pop();
int x = st2.top();
st2.pop();
int r = x - y;
st2.push(r);
}
else if(c == '*'){
int y = st2.top();
st2.pop();
int x = st2.top();
st2.pop();
int r = x * y;
st2.push(r);
}
else{
tmp.push_back(c);
}
}
//栈顶存放即为答案
return st2.top();
}
};