本博客已迁移至SnailDove's Blog,查看本文请点击此处
本文根据严蔚敏老师数据结构(c语言版) 写的程序 如有需要先去看视频 如有错误不当之处,欢迎指出,以免害人害己
例子
Exp = a * b + ( c – d / e )* f
前缀式:+ * a b * - c / d e f
中缀式:a * b + c–d / e * f
后缀式:a b * cd e /-f * +
相同点
数字都是按原式子排列的:因此操作数就按顺序入栈就好了
不同点
1:后缀式中运算符的顺序,正好就是求解的顺序
2:每个运算符和它之前出现且紧靠它的2个操作数构成一个最小表达式
关键:就是由原表达式求得后缀式
应用
S1:先设立两个栈,一个运算符栈,另一个后缀式栈。
S2:在表达式前后头尾加入=号,表示运算表达式开始和结束,因此在运算符中,=号优先级最低。
S3:若当前字符是操作数,则直接发送给后缀式栈。符合上面提到的共同点:数字按原表达式从左自右的顺序。
S4:左括号的优先级高于左括号前的运算符,左括号后的运算符优先级高于左括号,这样才能起到隔离的作用,则右括号前的运算符高于右括号,这样才能起到括号隔离内层表达式的作用!
S5:若当前运算符的优先级高于栈顶的运算符,则进运算符栈,否则退出运算符栈的栈顶运算符与从操作数栈栈顶取出的两个操作数运算结果作为新的操作数压入操作数栈,然后再把当前运算符入运算符栈。
源代码
1
#include<stdio.h>
2
3
#include<malloc.h>//malloc()
4
#include<process.h>//exit();
5
// 函数结果状态代码
6
#define TRUE 1
7
#define FALSE 0
8
#define OK 1
9
#define ERROR 0
10
#define INFEASIBLE -1
11
12
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
13
#define STACKINCREMENT 2 // 存储空间分配增量
14
15
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
16
typedef char SElemType;
17
struct SqStack
18
{
19
SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
20
SElemType *top; // 栈顶指针
21
int stacksize; // 当前已分配的存储空间,以元素为单位
22
};
23
24
Status InitStack(SqStack &S)
25
{ // 构造一个空栈S
26
if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
27
exit(-1); // 存储分配失败
28
S.top=S.base;
29
S.stacksize=STACK_INIT_SIZE;
30
return OK;
31
}
32
33
Status DestroyStack(SqStack &S)
34
{ // 销毁栈S,S不再存在
35
free(S.base);
36
S.base=NULL;
37
S.top=NULL;
38
S.stacksize=0;
39
return OK;
40
}
41