#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
string f(string s){
vector<char> v;
vector<char> vv;
for(int i = 0; i < s.length(); i++){
switch(s[i]){
case '+':
case '-':
while(!v.empty() && v.back() != '('){
char t = v.back();
vv.push_back(t);
v.pop_back();
}
v.push_back(s[i]);
break;
case '*':
case '/':
while(!v.empty() && (v.back() == '*' || v.back() == '/')){
vv.push_back(v.back());
v.pop_back();
}
v.push_back(s[i]);
break;
case '(':
v.push_back('(');
break;
case ')':
while(!v.empty() && v.back() != '('){
vv.push_back(v.back());
v.pop_back();
}
v.pop_back();
break;
default:
while(isdigit(s[i])){
vv.push_back(s[i]);
i++;
}
i--;
vv.push_back('#');
}
cout << i << " inserted" << endl;
}
while(!v.empty()){
vv.push_back(v.back());
v.pop_back();
}
s = "";
for(int i = 0; i < vv.size(); i++){
s += vv.at(i);
}
return s;
}
int f1(string s){
vector<int> v;
for(int i = 0; i < s.length(); i++){
int a, b;
switch(s[i]){
case '-':
b = v.back();
v.pop_back();
a = v.back();
v.pop_back();
v.push_back(a - b);
break;
case '+':
b = v.back();
v.pop_back();
a = v.back();
v.pop_back();
v.push_back(a + b);
break;
case '*':
b = v.back();
v.pop_back();
a = v.back();
v.pop_back();
v.push_back(a * b);
break;
case '/':
b = v.back();
v.pop_back();
a = v.back();
v.pop_back();
v.push_back(a / b);
break;
default:
a = 0;
while(isdigit(s[i])){
a = a * 10 + s[i] - '0';
i++;
}
v.push_back(a);
}
}
return v.back();
}
int main(){
string s = "(56-20)/(4+2)";
cout << f(s) << endl;
cout << f1(f(s));
}
過程中需要用到兩次棧,兩次都是從左到右進棧
中間結果用字符串接收。
操作符的位置會改變,但是操作數的位置不會改變。