#include <iostream>
using namespace std;
//后缀表达式转中缀表达式并计算表达式值
int compare(char,char);
int compute(char c[]);
void show(char c[]);
int main()
{
char c[100],c2[100], prst[10];//c保存后缀表达式,c2为中缀表达式,prst表示字符栈
int top=-1;
prst[++top]='#';//为了栈内无符号是便以比较
cin>>c;
int i=0,j=0;//i为c2计数,j为c计数
while(c[j]!='\0') //开始遍历字符串
{
if(c[j]<=57&&c[j]>=48) //若当前字符是数字
{
c2[i++]=c[j++]; //注意i,j的变化
}
else if(0==compare(c[j],prst[top])) //当前字符为右括号,出栈直到左括号出栈
{
while(prst[top]!='(')
{
c2[i++]=prst[top--];
}
j++; //右括号匹配完毕
top--; //左括号出栈
}
else if(-1==compare(c[j],prst[top])) //小于等于,栈顶符号出栈,j不变继续与栈顶比较
{
c2[i++]=prst[top--];
}
else if(1==compare(c[j],prst[top])) //优先级大于栈顶元素或者栈顶为左括号入栈
{
prst[++top]=c[j++];
}
}
while(top!=0) //当前字符串遍历完毕后,栈内的运输符出栈
{
c2[i++]=prst[top--];
}
show(c2); //打印
cout<<compute(c2)<<endl;
return 0;
}
int compare(char str1 ,char str2)//比较两字符优先级
{
if(str2=='#'||str2=='(') return 1;
switch(str1)
{
case ')':
return 0;
break;
case '(':
return 1;
break;
case '*':
case '/':
if(str2=='*'||str2=='/') return-1;
else return 1;
break;
case '+':
case '-':
return -1;
break;
default :
return 99;
break;
}
return -1;
}
int compute(char c[])
{
int i=0;
int top1=-1;
int prsd[10];
while(c[i]!='\0')
{
if(c[i]<=57&&c[i]>=48)
{
prsd[++top1]=c[i++]-48;
}
else
{
int x=prsd[top1--],y=prsd[top1--],z;
switch (c[i++])
{
case '+':
z=y+x;
break;
case '-':
z=y-x;
break;
case '*':
z=x*y;
break;
case '/':
z=y/x;
break;
default:
break;
}
prsd[++top1]=z;
}
}
return prsd[top1];
}
void show(char c[])
{
int i=0;
while(c[i]!='\0')
{
cout<<c[i++];
}
cout<<endl;
}
后缀表达式转中缀表达式并计算结果代码
最新推荐文章于 2022-10-28 23:39:03 发布