题目描述
中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将中缀表达式转换为后缀表达式。(测试数据元素为单个字符)
输入
中缀表达式
输出
后缀表达式
样例输入
A+(B-C/D)*E
样例输出
ABCD/-E*+
参考程序
#include<stdio.h>
#include<stdlib.h>
struct stack
{
char date[222];
int top;
};
struct NODE
{
char exp;
int pri;
}lpri[]={{'=',0},{'+',3},{'-',3},{'*',5},{'/',5},{'(',1},{')',6}},
rpri[]={{'=',0},{'+',2},{'-',2},{'*',4},{'/',4},{'(',6},{')',1}};
char e;
void push(struct stack *s,char c)
{
s->top++;
s->date[s->top]=c;
}
void pop(struct stack *s)
{
e=s->date[s->top];
s->top--;
}
int right(char c)
{
int i;
for(i=0;i<7;i++)
{
if(rpri[i].exp==c)
return rpri[i].pri;
}
}
int left(char c)
{
int i;
for(i=0;i<7;i++)
{
if(lpri[i].exp==c)
return lpri[i].pri;
}
}
int main()
{
char ch[222],num[222];;
int k=0;
struct stack *s;
s=(struct stack *)malloc(sizeof(struct stack));
s->top=-1;
scanf("%s",ch);
int i=0;
push(s,'=');
for(i=0;ch[i]!='\0';i++)
{
if(ch[i]>='A'&&ch[i]<='Z')
{
num[k]=ch[i];
k++;
}
else
{
if(right(ch[i])>left(s->date[s->top]))
push(s,ch[i]);
else if(right(ch[i])<left(s->date[s->top]))
{
pop(s);
num[k]=e;
k++;
i--;
}
else
pop(s);
}
}
while(s->top!=0)
{
pop(s);
num[k]=e;
k++;
}
for(i=0;i<k;i++)
printf("%c",num[i]);
return 0;
}
注意
该程序仅供学习参考!