数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
#include<stdio.h>
int switc(char c)//把输入的运算符转换成数字来比较优先级
{
if(c=='+'||c=='-') return 1;
if(c=='*'||c=='/') return 2;
if(c=='(') return 3;
if(c==')') return 4;
}
int main()
{
char b[1000];//b数组仿栈
int top=0;
char c;
while(scanf("%c", &c))//输入直到#结束
{
if(c=='#')
break;
if(c>='a'&&c<='z')//判断字符是不是运算符 不是就输出
{
printf("%c",c);
}
else
{
if(top==0) //判断b栈是不是为空 是就直接入栈
{
top++;//栈顶向上移一位
b[top] = c;//增加一个成员
}
else
if(switc(c)>switc(b[top]))//如果是运算符 而且输入的比栈顶运算符优先级高
{
if(switc(c) == 4)//如果是')'就把'('之前的运算符全部输出
{
while(b[top]!='(')
{
printf("%c",b[top--]);
}
top--;
}
else
{
top++;//如果不是 就入栈
b[top] = c;
}
}
else //如果优先级比它低
{
if(b[top]!='(') //如果不是'(' 就把它(优先级高)出栈
{
printf("%c", b[top]);
b[top] = c;
}
else
{
top++;
b[top] = c;//如果是'(' 就直接入栈
}
}
}
}
while(top!=0) //判断栈是否为空 不为空就全部出栈
{
printf("%c",b[top]);
top--;
}
printf("\n");
return 0;
}
之前一直不能AC,是因为这一行
if(switc(c)>switc(b[top]))
之前我的代码是
if(switc(c)>=switc(b[top]))
这个等号是不能要的,原因是当两个元素元素的优先级是一样的时候,比如*和/,我们应该是先输出当前栈顶的元素,然后将其出栈,再将另一个优先级相同的元素入栈,输出,出栈。
举个栗子:
输入:(a+b)*c/e
错误输出:ab+ce/*
正确输出:ab+c*e/