#include <iostream>
#include <string>
#include <stack>
#include <fstream>
using namespace std;
bool isone(char c){
return (c=='+' || c=='-');
}
bool istwo(char c){
return (c=='*' || c=='/');
}
string shorten(string m){
stack<char> s;
string sur;
int i;
char w;
sur;
for(i=0;i<m.size();i++){
if(isdigit(m[i]) || m[i]=='.'){
while(isdigit(m[i]) || m[i]=='.') sur += m[i++];
i--;
sur += '$';
}
else if(isone(m[i])){
while(s.size() && (isone(s.top()) || istwo(s.top()))){
sur+=s.top();
s.pop();
}
s.push(m[i]);
}
else if(m[i]==')'){
while(s.top()!='('){
sur+=s.top();
s.pop();
}
s.pop();
}
else if(istwo(m[i])){
while(s.size() && istwo(s.top())){
sur+=s.top();
s.pop();
}
s.push(m[i]);
}
else s.push(m[i]);
}
while(s.size()){
sur+=s.top();
s.pop();
}
return sur;
}
double tentimes(int n){
double res=1;
for(int i=0;i<n;i++){
res *= 10;
}
return res;
}
double str2double(string s){
double res=0;
char c;
int dec=0;
for(int i=1;i<=s.size();i++){
c=s[i-1];
if(c=='.') dec=i;
else if(!dec) res = res*10 + c-'0';
else res += (c-'0')/tentimes(i-dec);
}
return res;
}
double calculate(string s){
double res, t;
stack<double> num;
string temp;
int i;
for(i=0;i<s.size();i++){
temp="";
if(isdigit(s[i]) || s[i]=='.'){
while(isdigit(s[i]) || s[i]=='.') temp+=s[i++]; //如果最后一位是数字,这样做会出错
num.push(str2double(temp));
}
else{
switch (s[i]){
case '+': t=num.top(); num.pop(); t+=num.top();num.pop();num.push(t);break;
case '-': t=num.top(); num.pop(); t=num.top()-t;num.pop();num.push(t);break;
case '*': t=num.top(); num.pop(); t*=num.top();num.pop();num.push(t);break;
case '/': t=num.top(); num.pop(); t=num.top()/t;num.pop();num.push(t);break;
default: cerr << "Fatal Error! Result would be wrong!" << endl; system("pause");break;
}
}
}
res=num.top();
return res;
}
int main(){
string mid, sur;
cout << "please input:";
cin >> mid;
sur = shorten(mid);
cout << "successfully executed! The right hand operator expression is: ";
cout << sur << endl;
cout << "The result is: " <<calculate(sur) << endl;
return 0;
}表达式求值 【栈的应用 或 二叉树的应用
最新推荐文章于 2023-12-04 20:09:45 发布
该博客介绍了如何使用栈来简化中缀表达式,并通过计算得出结果。首先定义了用于判断操作符类型的函数,然后实现了一个将中缀表达式转化为后缀表达式的算法,接着通过计算后缀表达式得到最终结果。在主函数中,用户输入中缀表达式,程序将其转换为后缀表达式并进行计算。
2785

被折叠的 条评论
为什么被折叠?



