王道3.3 栈的应用
Posted 晨沉宸辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道3.3 栈的应用相关的知识,希望对你有一定的参考价值。
栈的应用
第一节 栈在括号匹配中的应用
一、分析过程
- 根据分析可以得到一下几个规律:
- 后面出现的左括号最先被匹配,遵循栈的LIFO特性
- 每出现一个右括号就要消耗一个左括号
- 遇到左括号就入栈,遇到右括号就消耗左括号
- 匹配不成功有三种情况:① 括号形状不匹配 ② 栈空了,但是仍然有右括号需要匹配 ③数组已经结束,但是栈内仍然有左括号(不空)
- 设计算法过程:
① 初始设置一个空栈,顺序读入括号
② 若有右括号,就将置于栈顶的括号取出,匹配成功或者不合法
③若是左括号,那么就进行入栈操作
④ 输入结束时检查栈空,若为空,则匹配成功,反之不成功
二、算法实现
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
using namespace std;
typedef struct
char data[MaxSize];
int top;
SqStack;
//初始化栈
void IniStack(SqStack &s)
s.top=0;
//判断栈是否为空
bool StaxkEmpty(SqStack s)
if(s.top==0)
return true;
else
return false;
//新元素入栈
bool Push(SqStack &s,char &x)
s.data[s.top]=x;
s.top++;
return true;
//栈顶元素出栈,用x返回
bool Pop(SqStack &s,char &x)
x=s.data[s.top-1];
s.top--;
//匹配算法
bool bracketCheck(char str[],int length)
SqStack s;
IniStack(s);
for(int i=0;i<length;i++)
if(str[i]=='('||str[i]==''||str[i]=='[')
Push(s,str[i]); //如果是左括号,入栈
else
if(StaxkEmpty(s))//如果是右括号并且栈为空
return false;
char topELem;
Pop(s,topELem);
if(str[i]==')'&&topELem!='(')
return false;
if(str[i]==''&&topELem!='')
return false;
if(str[i]==']'&&topELem!='[')
return false;
return StaxkEmpty(s);
int main()
char str[MaxSize];
int n;
scanf("%s",str);
scanf("%d",&n);
if(bracketCheck(str,n))
printf("匹配成功");
else
printf("匹配失败");
return 0;
第二节 栈在表达式求值中的应用
一、中缀、后缀、前缀表达式改写
- 示例
中缀表达式 | 后缀表达式 | 前缀表达式 |
---|---|---|
a+b | ab+ | +ab |
a+b-c | ab+c- | -+abc |
-
中缀表达式转后缀表达式
① 确定中缀表达式各个运算符的运算顺序
② 选择下一个运算符,按照**[左操作数 右操作数 运算符]**的方式组合成一个新的操作数
③ 如果还有运算符没有处理,就继续② -
后缀前缀都有可能不同,并且所有的操作数必须按照顺序
-
选择“左优先”原则
例子 A+B-CD/E+F 后缀: AB+CDE/-F+ -
前缀改后缀算法描述
从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数
① 从左往右扫描下一个元素,直到处理完所有元素
② 若扫描到操作数就压入栈,并回到①,否则执行③
③ 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到① -
中缀表达式转前缀表达式
① 确定中缀表达式各个运算符的运算顺序
② 选择下一个运算符,按照**[运算符 左操作数 右操作数]**的方式组合成一个新的操作数
③ 如果还有运算符没有处理,就继续② -
选择“右优先原则”:
A+B*(C-D)-E/F 前缀: +A-*B-CD/EF
以上是关于王道3.3 栈的应用的主要内容,如果未能解决你的问题,请参考以下文章
(王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀中缀和后缀)