#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct
{
char exp[100];
int top;
}SqStack;
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top = -1;
}
bool Push(SqStack *&s,char e)
{
if(s->top == MaxSize-1)
return false;
s->top++;
s->exp[s->top] = e;
return true;
}
bool GetTop(SqStack *s,char &e)
{
if(s->top == -1)
return false;
e = s->exp[s->top];
return true;
}
bool Pop(SqStack *&s,char &e)
{
if(s->top == -1)
return false;
e = s->exp[s->top];
s->top--;
return true;
}
bool StackEmpty(SqStack *s)
{
return (s->top == -1);
}
void DestroyStack(SqStack *&s)
{
free(s);
}
void trans(char *exp,char postexp[])
{
SqStack *Optr;
char e;
InitStack(Optr);
int i=0;
while(*exp != '\0')
{
switch(*exp)
{
case '(':
Push(Optr,'('); //左括号进栈
exp++; //继续扫描其他字符
break;
case ')':
Pop(Optr,e); //右括号代表一个表达式的结束,出栈元素e
while(e != '(') //继续出栈元素e,直到找到左括号
{
postexp[i++] = e;
Pop(Optr,e);
}
exp++; //继续扫描其他元素
break;
case '+':
case '-':
while(!StackEmpty(Optr)) //当不为空栈时循环
{
GetTop(Optr,e); //取栈顶元素e
if(e != '(') //e不是左括号时把元素e保存到post中,因为+ -优先级最小,碰到+-*/任意一个都需要让位
{
postexp[i++] = e;
Pop(Optr,e);
}
else //接下来两步如果碰到左括号便把+-放到栈中
break;
}
Push(Optr,*exp);
exp++;
break;
case '*':
case '/':
while(!StackEmpty(Optr)) //当不为空栈时循环
{
GetTop(Optr,e); //取栈顶元素e
if(e == '*' || e == '/') //因为*/的优先级较大,所以只考虑碰到 * / 时让位
{
postexp[i++] = e; //把e放到post中
Pop(Optr,e); //继续出栈元素e
}
else
break; //其他的情况都可以终止,让* /进栈
}
Push(Optr,*exp);
exp++;
break;
default: //碰到数字时
while(*exp >= '0' && *exp <= '9')
{
postexp[i++] = *exp;//直接进栈
exp++;
}
postexp[i++] = '#'; //结尾用 # 分隔
}
}
while(!StackEmpty(Optr)) //当扫描完一遍,但是栈中还有元素
{
Pop(Optr,e); //出栈
postexp[i++] = e;
}
postexp[i] = '\0'; //增加一个结束标志
DestroyStack(Optr); //销毁栈
}
int main()
{
char exp[]="(56-20)/(4+2)";
char postexp[MaxSize];
trans(exp,postexp);
printf("中缀表达式:%s\n",exp);
printf("后缀表达式:%s\n",postexp);
return 0;
}
将中缀表达式换成后缀表达式
最新推荐文章于 2023-10-09 04:45:00 发布