#include<stdio.h>
#include<stack>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
#define MAXN 111
map<char,int>yxj;//优先级
char shi[MAXN];
char houzui[MAXN];
int count1=0,count2=0,len;
void init(){
yxj['+']=1;
yxj['-']=1;
yxj['*']=2;
yxj['/']=2;
}
void hz(){
stack<char> sta;
sta.push('#');
count1=0,count2=0;
while(!sta.empty()){
if(shi[count1]>='0'&&shi[count1]<='9'){//判断是数字,则进后缀数组
houzui[count2++]=shi[count1];
}
else{//判断为是运算符或括号
if(shi[count1]=='('){//左括号进栈
sta.push(shi[count1]);
}
else if(shi[count1]==')'){//右括号则输出栈内运算符,直到碰到左括号
while(sta.top()!='('){
houzui[count2++]=sta.top();
sta.pop();
}
sta.pop();
}
else{//判断为运算符
if(sta.top()=='#'){//如果是第一个运算符则直接进栈
sta.push(shi[count1]);
}
else{
if(yxj[shi[count1]]>yxj[sta.top()]){//当前运算符优先级大于栈顶运算符优先级,直接进栈
sta.push(shi[count1]);
}
else{
char temp=shi[count1];
while(yxj[temp]<=yxj[sta.top()]){//输出不大于当前运算符优先级的栈里的运算符
houzui[count2++]=sta.top();
sta.pop();
if(sta.top()=='#')
break;
}
sta.push(temp);//当前运算符进栈
}
}//不为#
}
}
count1++;//计数器向后移
if(count1==len){//扫描完表达式长度,则输出完栈里所有运算符
while(!sta.empty()){
houzui[count2++]=sta.top();
sta.pop();
}
}
}//stack
for(int i=0;i<count2-1;++i)
printf("%c",houzui[i]);
printf("\n");
}
int qz(){
stack<int> sta;//此求值只针对个位整数,若表达式出现除法,出现小数,可以栈可以设为double,
//若多位可以在输入内设个num数组然后num[count3]=num[count3]*10+shi[count1],重新组建个结
//构体struct{ char number[111];}存放数字和运算符
for(int i=0;i<count2-1;++i){
if(!(houzui[i]>='0'&&houzui[i]<='9')){ //若为运算符,则退出栈内2个数字进行相关运算
int sec=sta.top();
sta.pop();
int fir=sta.top();
sta.pop();
int result;
if(houzui[i]=='+')
result=fir+sec;
else if(houzui[i]=='-')
result=fir-sec;
else if(houzui[i]=='*')
result=fir*sec;
else if(houzui[i]=='/')
result=fir/sec;
sta.push(result); //将结果压栈
}
else//为数字,则进栈
sta.push(houzui[i]-'0');
}
return sta.top();
}
int main(){
init();
while(scanf("%s",shi)!=EOF){
count1=0,count2=0;
len=strlen(shi);
hz();
printf("值为%d\n",qz());
}
return 0;
}
后缀表达式转化及求值
最新推荐文章于 2024-04-05 03:38:29 发布