Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample
Input
a*b+(c-d/e)*f#
Output
abcde/-f+
#include <stdio.h>
#include <stdlib.h>
char s[100005];
int main()
{
int top=0;
char a;
while(scanf("%c",&a))
{
if(a=='#')
break;
else if(a>='a'&&a<='z')
printf("%c",a);
else if(a=='(')
s[++top]=a;
else if(a==')')
{
for(;s[top]!='(';top--)
printf("%c",s[top]);
top--;
}
else if(a=='+'||a=='-')
{
while(1)
{
if(top==0||s[top]=='(')
{
s[++top]=a;
break;
}
printf("%c",s[top--]);
}
}
else if(a=='*'||a=='/')
{
while(1)
{
if(s[top]=='+'||s[top]=='-'||s[top]=='('||top==0)
{
s[++top]=a;
break;
}
printf("%c",s[top--]);
}
}
}
for(;top>0;top--)
printf("%c",s[top]);
return 0;
}
方法二
#include<stdio.h>
int swi(char c)//把输入的运算符转换成数字来比较优先级
{
if(c=='+'||c=='-') return 1 ;
if(c=='*'||c=='/') return 2 ;
if(c=='(') return 3 ;
if(c==')') return 4 ;
return 0 ;
}
int main()
{
int top = 0 ;
char c, stack[100] ;
while(scanf("%c", &c))
{if(c=='#')
break;
if(c>='a'&&c<='z')//判断字符是不是运算符 不是就输出
{
printf("%c", c) ;
}
else
{
if(top==0)//判断b栈是不是为空 是就直接入栈
{
top++ ;//栈顶向上移一位
stack[top] = c ;//增加一个成员
}
else
if(swi(c)>swi(stack[top]))//如果是运算符 而且输入的比栈顶运算符优先级高
{
if(swi(c)==4)//如果是')'就把'('之前的运算符全部输出
{
while(stack[top]!='(')
{
printf("%c",stack[top--]) ;
}
top-- ;
}
else
{
top++ ;//如果不是 就入栈
stack[top] = c ;
}
}
else//如果优先级比它低
{
if(stack[top]!='(')//如果不是'(' 就把它(优先级高)出栈
{
printf("%c", stack[top]) ;
stack[top] = c ;
}
else
{
top++ ;
stack[top] = c ;//如果是'(' 就直接入栈
}
}
}
}
while(top!=0)//判断栈是否为空 不为空就全部出栈
{
printf("%c", stack[top]) ;
top-- ;
}
return 0 ;
}