class Solution {
private:
//计算后缀表达式
vector<string> backExp(string s){
stack<string> st; //存放运算符
vector<string> res;
for(int i=0;i<s.size();i++){
//遇到了数字
if(isdigit(s[i])){
int k=i+1;
while(k<s.size() && isdigit(s[k])) //数字不止一位
k++;
res.push_back(s.substr(i,k-i));
i=k-1;
continue;
}
//遇到了乘除运算符
if(s[i]=='*' || s[i]=='/'){
while(!st.empty() && (st.top()=="/" || st.top()=="*")){ //弹出优先级相同或以上的栈内运算符
res.push_back(st.top());
st.pop();
}
string tmp="";
st.push(tmp+s[i]);
continue;
}
//遇到了加减运算符
if (s[i]=='+' || s[i]=='-') {
while (!st.empty()) { //弹出优先级相同或以上的栈内运算符,就是所有运算符
res.push_back(st.top());
st.pop();
}
string tmp="";
st.push(tmp+s[i]); // 运算符入栈
continue;
}
}
//弹出栈内所有元素到表达式
while(!st.empty()){
res.push_back(st.top());
st.pop();
}
return res;
}
// 计算后缀表达式
int evalRPN(vector<string> &tokens) {
stack<int> st; //栈,存放数字
for(int i=0;i<tokens.size();i++){ //如果是运算符,对栈中前两个进行计算
if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*" || tokens[i]=="/"){
int n2=st.top(); //注意区别左右值,先出栈为右值,后出栈为左值
st.pop();
int n1=st.top();
st.pop();
if(tokens[i]=="+") //计算
st.push(n1+n2); //将结果放回栈中
else if(tokens[i]=="-")
st.push(n1-n2);
else if(tokens[i]=="*")
st.push(n1*n2);
else if(tokens[i]=="/")
st.push(n1/n2);
}
else
st.push(stoi(tokens[i])); //如果是数字,字符串转数字入栈
}
return st.top(); //栈中的最后一个元素为计算结果
}
public:
int calculate(string s) {
vector<string> t=backExp(s);
return evalRPN(t);
}
};
227.基本计算器 II
最新推荐文章于 2021-10-25 11:08:24 发布