什么是后缀表达式
后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。
后缀表达式计算
后缀表达式计算与前缀表达式类似,只是顺序是从左至右,具体过程如下:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
计算步骤
例如:后缀表达式为9+(3-1)*2+5/2转为后缀表达式为 9 3 1 - 2 * + 5 / 2 +
- 初始化一个空栈。此栈用来对要运算的数字进出使用
- 将9 3 1压栈遇到符号- 将栈顶两个元素拿出计算 再存入栈
- 遇到数字继续入栈 遇到符号继续将栈顶两个元素拿出计算 再存入栈
- 同样的操作步骤直至表达式计算完成
中缀表达式
中缀表达式就是四则运算表达式
中缀表达式转换成后缀表达式
上面的计算规则就是转换规则
即从左到右遍历,遇到数字就先写上,遇到任何运算符号 先判断与当前栈内的符号优先级,如果优先级高则直接进行运算,如果栈内的优先级高则先出栈再将当前的运算符压栈 直至栈内运算符运算完毕
C语言实现版
#include <stdio.h>
#include <stdlib.h>
#define STACKSIZE 250 //定义数组最大的容量
//栈的结构体
typedef struct _stack {
char dat;
struct _stack *next;
} stack;
int advance(char x) {
//判断优先级
if (x == '+' || x == '-')
return 0;
else if (x == '*' || x == '/')
return 1;
else if (x == '@' || x == '(' || x == ')')
return -1;
}
int main() {
// s是栈 top是栈顶指针
stack *s, *top;
char c;
int calc[50];
int i = 0;
s = (stack *) malloc(sizeof(stack));
s->dat = '@'