设A和B为某个双目运算符‘#’的两个操作数,则有下列定义:
#AB |
前缀表达式 |
A#B |
中缀表达式 |
AB# |
后缀表达式 |
前缀表达式
- 是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。
- 为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。
- 例如:1-(2+3) 的前缀表达式为- 1 + 2 3
后缀表达式(逆波兰式)
将运算符写在后面,操作数写在前面
例如:求(a+b)*c-(a+b)/e的后缀表达式:
- (a+b)*c-(a+b)/e
- →((a+b)*c)((a+b)/e)-
- →((a+b)c*)((a+b)e/)-
- →(ab+c*)(ab+e/)-
- →ab+c*ab+e/-
例如:求9+(3-1)*3+10/2的后缀表达式:
原则:将最后计算的运算符放在后面
中缀表达式转后缀表达式
- 算法思路:
- (1)依次扫描中缀表达式
- (2)遇到数字就输出
- (3)遇到运算符,有以下几种情况
-
- a: 栈空直接入栈
- b: 遇到左括号直接入栈
- c: 遇到右括号则将栈顶的运算符出栈并输出,直到左括号出栈为止,但左括号不作为输出
- d: 遇到运算符优先级高于栈顶运算符优先级,则入栈
- e: 遇到运算符优先级低于或等于栈顶运算符优先级,则将栈顶运算符出栈并输出,直到其优先级高于栈顶运算符优先级时停止(或栈为空),最后再将其入栈
-
- (4)若中缀表达式中的各对象处理完毕,则把栈中存留的运算符依次弹栈输出。
注:优先级关系 1.先乘除,后加减 2.从左算到右 3.先括号内,后括号外
全部代码函数
SqStack* InitStack();//初始化栈
SElemType GetTop(SqStack* s);//若栈不空,获取S的栈顶元素
Status Push(SqStack* s, SElemType e