版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
254中缀表达式转化为后缀表达式
描述
输入一个中缀算术表达式,将其转换为后缀表达式。运算符包括+、-、*、/、(、)、=,参加运算的为小于10的自然数。(只考虑二元运算即可)
输入
多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。
输出
对于每组数据输出一行,为表达式的后缀式。
输入样例 1
9+(3-1)3+1/2=
1+2=
=
输出样例 1
931-3+12/+
12+
#include<iostream>
using namespace std;
#define MAX 100
#define OK 0
#define ERROR -1
#define OVERFLOW -2
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S)
{
S.base=new char[MAX];
if(!S.base) return OVERFLOW;
S.top=S.base;
S.stacksize=MAX;
return OK;
}
int Push(SqStack &S, char e)
{
if(S.top-S.base==S.stacksize)
return ERROR;
*S.top=e;
S.top++;
return OK;
}
int Pop(SqStack &S)
{
if(S.top==S.base)
return ERROR;
S.top--;
return OK;
}
char Top(SqStack S)
{
if(S.top==S.base)
return ERROR;
return *(S.top-1);
}
char Precede(char a,char b)
{
if((a=='('&&b==')')||(a=='='&&b=='='))
return '=';
else if(a=='='||a=='('||b=='('||((a=='+'||a=='-')&&(b=='*'||b=='/')))
return '<';
else
return '>';
}
int main()
{
char s[100];
while(cin>>s&&s[0]!='=')
{
SqStack op;
InitStack(op);
Push(op,'=');
for(int i=0;s[i]!='\0';i++)
{
if(s[i]>='0' && s[i]<='9')
cout<<s[i];
else
{
while(1)
{
if(Precede(Top(op),s[i])=='<')
{
Push(op,s[i]);
break;
}
else if(Precede(Top(op),s[i])=='>')
{
char oper;
oper=Top(op);
Pop(op);
cout<<oper;
}
else
{
Pop(op);
break;
}
}
}
}
cout<<endl;
}
return 0;
}