只能实现正整数的加减乘除
表达式为中缀(字符串),变后缀(队列)的规则:
1、从前到后取中缀表达式的字符。
2、如果是数字直接加入后缀队列。
3、如果是运算符:
若中缀表达式运算符优先级高于操作符栈顶元素优先级则压入栈中;
否则,弹栈直到栈空或栈顶元素优先级不高于中缀表达式运算符;
4、若中缀表达式还没有遍历完,重复2,3。
5、将运算符栈中剩余元素加入到后缀队列中。
#include <iostream>
#include <stack>
#include <map>
#include <queue>
using namespace std;
struct node{
char c;
double num;
bool isNum;
};
map<char,int>oper;
void Change(string s,queue<node>&q){//中缀表达式变后缀表达式
stack<node>op;
for (int i = 0; i < s.length();) {
node temp;
temp.num=0;
if(s[i]>='0'&&s[i]<='9'){
temp.isNum=true;
temp.num=s[i++]-'0';
while(i<s.length()&&s[i]>='0'&&s[i]<='9')//数字可能不止一位
temp.num=temp.num*10+(s[i++]-'0');
q.push(temp);
}else{
temp.isNum=false;
temp.c=s[i];
while(!op.empty()&&oper[s[i]]<=oper[op.top().c]){
q.push(op.top());
op.pop();
}
op.push(temp);
i++;
}
}
while(!op.empty()){
q.push(op.top());
op.pop();
}
};
double Cal(queue<node>q){//后缀表达式求值
stack<node>s;
node temp;
while(!q.empty()){
temp.num=0;
if(q.front().isNum==true){
s.push(q.front());
q.pop();
}
else{
double temp2=s.top().num;
s.pop();
double temp1=s.top().num;
s.pop();
if(q.front().c=='+')temp.num=temp1+temp2;
else if(q.front().c=='-')temp.num=temp1-temp2;
else if(q.front().c=='*')temp.num=temp1*temp2;
else
temp.num=temp1/temp2;
q.pop();
s.push(temp);
}
}
return s.top().num;
}
int main(){
oper['+']=oper['-']=1;
oper['*']=oper['/']=2;
queue<node>q;
string exp;
cin>>exp;
for (string::iterator it=exp.end();it!=exp.begin();it--) {//去掉表达式中的空格
if(*it==' ')exp.erase(it);
}
Change(exp,q);
printf("%.2f\n",Cal(q));
return 0;
}
本文介绍了一种将中缀表达式转换为后缀表达式的方法,并详细解释了转换规则及计算过程。通过使用栈和队列数据结构,可以有效地处理正整数的加减乘除运算,最终实现对后缀表达式的求值。
1187

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



