数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
Hint
后缀式,又称逆波兰式,这离散的东西我们在这里就不多说了。
这题的思路并不难理解,只不过是我自己用代码实现的时候出现了挺多的困难的,加上今天测试,大家测试完基本都不想来机房做题,现在而且现在是晚上更没有什么人了,可自己突然想到好歹自己以前那么拼命,可不能现在就这样放弃了,再说我就只有这一次机会啊。
如果我们只是要逆波兰式的输出的话,可以直接把非运算符直接输出。再把运算符分成几个优先级。
首先要把第一个运算符压入栈中,不然嘞?第一个不压进去的话就没东西比较了。
后面来的运算符再和栈中的元相比。
如果新来的比栈里面的优先级大,就压到栈里面,否则就输出栈的。因为要把优先级大的先输出。
废话不多说了,看看代码是怎么实现的。
#include <stdio.h>
#include <stdlib.h>
int pri(char c)
{
if(c=='+'||c=='-')
return 1;
else if(c=='*'||c=='/')
return 2;
else if(c=='(')
return 3;
else if(c==')')
return 4;
return 0;
}
int main()
{
int i,j,k;
char str,stack[1000];
int top = 0;
while(~scanf("%c",&str)&&str!='#'){
if(str>='a'&&str<='z')
printf("%c",str);
else{
if(top==0){
stack[++top] = str;
}
else if(pri(str)>pri(stack[top])){
if(pri(str)==4){//输入的为“)”时,就要把“(”前的栈里的东西输出来
while(stack[top]!='('){
printf("%c",stack[top]);
top--;
}
top--;//这一句是把“(”从栈里删除
}
else
stack[++top] = str;
}
else{//如果新输入的运算符没有栈里面的优先级大的话,那就要把优先级大的输出来
if(stack[top]!='('){
printf("%c",stack[top]);
stack[top] = str;
}
else
stack[++top] = str;
}
}
}
while(top){
printf("%c",stack[top]);
top--;
}
printf("\n");
return 0;
}