王道3.3 栈的应用

Posted 晨沉宸辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道3.3 栈的应用相关的知识,希望对你有一定的参考价值。

栈的应用

第一节 栈在括号匹配中的应用

一、分析过程

  1. 根据分析可以得到一下几个规律:
  • 后面出现的左括号最先被匹配,遵循栈的LIFO特性
  • 每出现一个右括号就要消耗一个左括号
  • 遇到左括号就入栈,遇到右括号就消耗左括号
  • 匹配不成功有三种情况:① 括号形状不匹配 ② 栈空了,但是仍然有右括号需要匹配 ③数组已经结束,但是栈内仍然有左括号(不空)
  1. 设计算法过程:
    ① 初始设置一个空栈,顺序读入括号
    ② 若有右括号,就将置于栈顶的括号取出,匹配成功或者不合法
    ③若是左括号,那么就进行入栈操作
    ④ 输入结束时检查栈空,若为空,则匹配成功,反之不成功

二、算法实现

#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;


第二节 栈在表达式求值中的应用

一、中缀、后缀、前缀表达式改写

  1. 示例
中缀表达式后缀表达式前缀表达式
a+bab++ab
a+b-cab+c--+abc
  1. 中缀表达式转后缀表达式
    ① 确定中缀表达式各个运算符的运算顺序
    ② 选择下一个运算符,按照**[左操作数 右操作数 运算符]**的方式组合成一个新的操作数
    ③ 如果还有运算符没有处理,就继续②

  2. 后缀前缀都有可能不同,并且所有的操作数必须按照顺序

  3. 选择“左优先”原则
    例子 A+B-CD/E+F 后缀: AB+CDE/-F+

  4. 前缀改后缀算法描述
    从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数
    ① 从左往右扫描下一个元素,直到处理完所有元素
    ② 若扫描到操作数就压入栈,并回到①,否则执行③
    ③ 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到①

  5. 中缀表达式转前缀表达式
    ① 确定中缀表达式各个运算符的运算顺序
    ② 选择下一个运算符,按照**[运算符 左操作数 右操作数]**的方式组合成一个新的操作数
    ③ 如果还有运算符没有处理,就继续②

  6. 选择“右优先原则”:
    A+B*(C-D)-E/F 前缀: +A-*B-CD/EF

以上是关于王道3.3 栈的应用的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀中缀和后缀)

(王道408考研数据结构)第三章栈和队列-第三节2:栈的应用之递归

栈的应用---中缀变后缀

中缀表达式转换成后缀表达式并求值

栈的应用之中缀表达式转化为后缀表达式(逆波兰表达式)

数据结构之栈的应用:中缀表达式求值