数据结构实验之栈与队列二:一般算术表达式转换成后缀式
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
中缀表达式转化为后缀表达式步骤:
一.左到右遍历,遇到字母直接输出;
二.遇到操作符:
1.若栈为空或栈顶元素为‘(’或‘(’还未找到‘)’,则直接压栈.
2.若栈顶元素为普通操作符,则比较优先级,若待压栈的操作符比栈顶操作符优先级高,则直接压栈,否则(即待压栈的操作符比栈顶操作符优先级低或同级)将栈顶元素出栈,再接着比较和栈顶元素的优先级.
3.若遇到),则依次弹出栈顶的运算符,直到遇到(为止,此时将这一对括号丢弃.
4. 最后将栈中剩余的运算符依次弹出栈.
代码如下:
#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>
#include <stdlib.h>
#include <string.h>
char q[100005];
int main()
{
int i,top,len;
top=0;
char a[100005];
scanf("%s",a);
len=strlen(a);
for(i=0; i<len-1; i++)
{
if(a[i]>='a'&&a[i]<='z')
printf("%c",a[i]);
else
{
if(top==0||q[top-1]=='('||a[i]=='(')
q[top++]=a[i];
else if(a[i]=='*'||a[i]=='/')
{
while(1)
{
if(q[top-1]=='('||top==0||q[top-1]=='+'||q[top-1]=='-')
{
q[top++]=a[i];
break;
}
printf("%c",q[--top]);
}
}
else if(a[i]=='+'||a[i]=='-')
{
while(1)
{
if(q[top-1]=='('||top==0)
{
q[top++]=a[i];
break;
}
printf("%c",q[--top]);
}
}
else if(a[i]==')')
{
while(q[top-1]!='(')
{
printf("%c",q[--top]);
}
top--;
}
}
}
while(top!=0)
{
printf("%c",q[--top]);
}
return 0;
}