题目
description:
假设表达式由单字母变量和双目四则运算算符构成。试编写程序,将一个通常书写形式且书写正确的表达式转换为逆波兰式。
input:
输入由单字母变量和双目四则运算算符构成的表达式。
output:
输出其逆波兰式。
sample_input:
(a+b)c
sample_output:
ab+c
思路
逆波兰式,分为三种情况讨论,一是遇到操作数(字母)的处理,二是括号的处理,三是对运算符(+ - * /)的处理。
- 操作数
直接弹出 - 括号
前括号’(‘直接入栈,后括号’)‘则一直出栈栈顶元素,直到’('出栈 - 运算符
判断优先级:
若为除括号外的其它运算符,当优先级高于栈顶运算符时,直接入栈;
否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到出现一个比它优先级低或者栈空为止。
*、/的优先级高于+、-,同级别的或相等的运算符优先级相等。这里使用函数判断:
/*比较当前操作符a和栈顶元素b的优先级,是否弹出栈顶元素?1/0*/
int compare(char a, char b) {
//compare(Op[i],optr[top])
if ((a == '+' || a == '-') && (b == '/' || b == '*'))
return 1;
if ((a == '*' || a == '/') && (b == '+' || b == '-'))
return 0;
if ((a == '+' || a == '-') && (b == '+' || b == '-')