数据结构实验之栈与队列二:一般算术表达式转换成后缀式
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
#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; }
中缀表达式转化为后缀表达式步骤:
一.左到右遍历,遇到字母直接输出;
二.遇到操作符:
1.若栈为空或栈顶元素为‘(’或‘(’还未找到‘)’,则直接压栈.
2.若栈顶元素为普通操作符,则比较优先级,若待压栈的操作符比栈顶操作符优先级高,则直接压栈,否则将栈顶元素出栈,再接着比较继续和栈顶元素的优先级.
3.若遇到),则依次弹出栈顶的运算符,直到遇到(为止,此时将这一对括号丢弃.
4. 最后将栈中剩余的运算符依次弹出栈.