栈的基础应用3——含括号的运算表达式求解

本博客已迁移至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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值