数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS Memory Limit: 65536KB
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。 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;}新闻热点
疑难解答