数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
Hint
Source
THINK:
三种情况,一种是优先级,即当前是+-,但是栈顶的元素是/*,或者当前的元素是+-或者/和乘,栈顶元素也是相同级别的,相同级别的容易忘记,这时候栈顶元素就要出来,当前元素入栈;
第二种是左右括号的情况,遇到右括号就要把左括号之间的所有元素都输出;同时还要跳过左括号;
第三种就是其他的情况了
最后把栈清空;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char s[10000000],a[1000000];
int main()
{
memset(s,0,sizeof(s));
memset(a,0,sizeof(a));
scanf("%s",s);
int len=strlen(s);
int top=0;
for(int i=0; i<len-1; i++)
{
if(s[i]>='a'&&s[i]<='z')
{
printf("%c",s[i]);
}
else
{
if(((s[i]=='+'||s[i]=='-')&&(a[top]=='*'||a[top]=='/'))||((s[i]=='+'||s[i]=='-')&&(a[top]=='+'||a[top]=='-'))
||((s[i]=='*'||s[i]=='/')&&(a[top]=='*'||a[top]=='/')))
{
printf("%c",a[top]);
a[top]=s[i];
}
else if(s[i]==')')
{
while(a[top]!='(')
{
printf("%c",a[top--]);
}
top--;
}
else
{
a[++top]=s[i];
}
}
}
while(top!=0)
{
printf("%c",a[top--]);
}
printf("\n");
return 0;
}