数据结构与算法之-----栈的应用(二)

        写在前面的话:本专栏的主要内容:数据结构与算法。

        1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用系统的库文件,因此,建议这类小伙伴们从本专栏的总揽​​​​​​​按顺序进行学习

        ​​​​​​​2.对于想查询有关资料的小伙伴们,可以选择性地浏览。希望小伙伴们都能有所收获~

 ​  ​​​​​​       

        本章我们来看看栈的第二个应用:

        问提描述:如何判断一个表达式中的 (), [], {} 是否匹配?

        比如,表达式“ 3*(8+3*2) ”是匹配的,表达式“ (3*4+33 ”是不匹配的。 

        问题解决(ParenMatch.h):


/*
 * 作者:易果啥笔
 * 时间:2021.8.20
 * 内容:栈的典型应用二:判断括号(),[],{}是否匹配
 *
 */

#ifndef STACK_PARENMATCH_H
#define STACK_PARENMATCH_H
#include "Stack.h"


//length()函数用于求数组中表达式的字符数
int length(const char exp[]){
    static int count = 0;
    for(int i = 0 ; exp[i]!='\0'; i++){
        count++;
    }
    return count;
}



//trans()函数将bool值转换为人性化语言
void trans(bool _bool) {
    if(_bool)cout<<"匹配"<<endl;
    else cout<<"不匹配"<<endl;
}



//paren()函数用于判断表达式中括号是否匹配
bool paren(const char exp[],int lo,int hi) {
    Stack<char> S;
    for(int i = lo ; i < hi ; i++){
        switch (exp[i]) {
            case '(' :
            case '[' :
            case '{' : S.push(exp[i]); break;
            case ')' :if( ( S.Empty() ) || ( '(' != S.pop() )) return false; break;
            case ']' :if( ( S.Empty() ) || ( '[' != S.pop() )) return false; break;
            case '}' :if( ( S.Empty() ) || ( '{' != S.pop() )) return false; break;
            default: break;
        }
    }

    return S.Empty();
}

#endif //STACK_PARENMATCH_H

        匹配算法的核心思想是,一旦遇到左括号 (, [, {, 便将其压入栈中;如果遇到右括号 ), ], }, 便验证此时它前面的括号(也就是栈顶元素)是否与之匹配,如果不匹配,直接返回false;如果匹配,继续往下扫描,直至栈为空。

        我们来验证此算法的正确性:


/*
 * 作者:易果啥笔
 * 时间:2021.8.20
 * 内容:栈的应用
 *
 */

#include <iostream>
#include "Stack.h"
#include "ParenMatch.h"
using namespace std;


//遍历函数print
template <typename T> void print(T& e){ cout<<e; };



int main() {
    

    //应用二:判断一个表达式中括号(),[],{}是否匹配
    char expression1[40] = "(1+23*4-56*7))";
    cout<<"'(1+23*4-56*7))'中的括号是否匹配?:";trans(paren(expression1,0,length(expression1)));

   

    return 0;
}

       欲了解栈的其他应用,点击传送门跳转:

        1. 栈的应用(一)

        3. 栈的应用(三)​​​​​​​

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易果啥笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值