您的位置:首页 > 其它

表达式求值

2018-03-26 10:58 204 查看
#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));
}
过程中需要用到两次栈,两次都是从左到右进栈
中间结果用字符串接收。
操作符的位置会改变,但是操作数的位置不会改变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: