数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
提示
遇到字母直接输出;
括号的优先级最高,若栈为空,则运算符进栈;
若不为空,若该元素的优先级 大于 栈顶元素优先级,进栈;否则栈顶元素出栈,该元素进栈;
遇到左括号后一直到右括号,括号内的规则也是一样。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
int f(char x)
{
if( x=='+'||x=='-' ) return 1;
if( x=='*'||x=='/' ) return 2;
if( x=='(' ) return 3;
if( x==')' ) return 4;
}
int main()
{
char st[N];
char t[N];
char a[N];
scanf("%s",st);
int i;
int topt = -1;
int topa = -1;
for( i = 0;st[i]!='#';i++ )
{
if( (st[i]>='a'&&st[i]<='z')||(st[i]>='A'&&st[i]<='Z') )
{
a[++topa] = st[i];
}
else if( topt==-1 )
{
t[++topt] = st[i];
}
else if( f(st[i])>=f(t[topt]) )
{
if( st[i]==')' )
{
while( t[topt]!='(' )
a[++topa] = t[topt--];
topt--;
}
else
{
t[++topt] = st[i];
}
}
else
{
if( t[topt]!='(' )
{
a[++topa] = t[topt];
t[topt] = st[i];
}
else
{
t[++topt] = st[i];
}
}
}
while( topt>=0 )
{
a[++topa] = t[topt];
topt--;
}
for( i = 0;i <= topa;i++ )
{
printf("%c",a[i]);
}
printf("\n");
return 0;
}