C语言后缀表达式还原为中缀表达式
本文提供了C++支持下的C语言后缀表达式还原为中缀表达式。
可供初学者自学,如有出错不吝提出。
/*
Updated 2022.7.9
Bug fixed: cannot calculate decimals.
comments: change int to float.
*/
#include<stdio.h>
typedef struct{
float data[100];
int top;
}SqStack;
bool InitStacks(SqStack &S){
S.top = -1;
return true;
}
bool EnStack(SqStack &S, float pushData){
S.data[++S.top] = pushData;
return true;
}
bool CalcElem(SqStack &S,int info){
switch(info){
case '+' : S.data[S.top - 1] += S.data[S.top];S.top--;break;
case '-' : S.data[S.top - 1] -= S.data[S.top];S.top--;break;
case '*' : S.data[S.top - 1] *= S.data[S.top];S.top--;break;
case '/' : S.data[S.top - 1] /= S.data[S.top];S.top--;break;
}
return true;
}
bool ReadData(SqStack &S){
char info;float pushData = 0;int flag = 1;
while(1){
scanf("%c",&info);
if(info >= '0' && info <= '9'){
flag = 1;
pushData = (float)pushData * 10 + (info - '0');
continue;
}
if(info == ' '){
if(flag == 1)//只有前面是数字才需要再次压栈
EnStack(S,pushData);
pushData = 0;
continue;
}
if(info == '+' || info == '-' || info == '*' || info == '/'){
flag = 0;
CalcElem(S,info);
continue;
}
if(info == 10) break;
}
return true;
}
int main(void){
SqStack S;
InitStacks(S);
ReadData(S);
if(S.top != 0)
printf("Error!\n");
else
printf("%g",S.data[S.top]);
return 0;
}