栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构和算法之栈的应用:括号匹配

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构和算法之栈的应用:括号匹配

栈的应用:括号匹配
  • 1 括号匹配问题
    • 1.1 介绍
    • 1.2 真题演练
      • 1.2.1 代码展示区

1 括号匹配问题 1.1 介绍

看下列代码,思考括号合法性规律

void test(){
  int a[10][10];
  int x=10*(20*(1+1)-(3-2));
  printf("加油!奥利给!");
}

最后出现的左括号最先被匹配(1LIFO)

[!NOTE] 重点

  1. 遇到左括号就入栈
  2. 遇到有括号,就“消耗”一个左括号
1.2 真题演练

力扣原题:https://leetcode.cn/problems/valid-parentheses/

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

1.2.1 代码展示区
#include "stdbool.h"  
#include "stdlib.h"  
#include "stdio.h"  
#include "string.h"  
  
#define MAXSIZE 10*10*10*10  
typedef struct Stack {  
    char data[MAXSIZE];  
    int top;  
} Stack;  
  
bool initStack(Stack **stack) {  
    *stack = (Stack *) malloc(sizeof(Stack));  
    if (NULL == *stack) {  
        return false;  
    }  
    (*stack)->top = -1;  
    return true;  
}  
  
bool push(Stack *stack, char c) {  
    if (NULL == stack || stack->top == MAXSIZE - 1) {  
        return false;  
    }  
    stack->top++;  
    stack->data[stack->top] = c;  
    return true;  
}  
  
bool pop(Stack *stack, char *c) {  
    if (NULL == stack || stack->top < 0) {  
        return false;  
    }  
    *c = stack->data[stack->top];  
    stack->top--;  
    return true;  
}  
  
bool empty(Stack *stack) {  
    return stack == NULL || stack->top < 0;  
}  
  
bool isValid(char *s) {  
    Stack *stack;  
    initStack(&stack);  
    size_t len = strlen(s);  
    if (len % 2 != 0) {  
        return false;  
    }  
    for (int i = 0; i < len; ++i) {  
        char left = s[i];  
        //左括号入栈  
        if (left == '{' || left == '(' || left == '[') {  
            push(stack, left);  
        } else {  
            //有右括号,但是栈空,那必然是错误的  
            if (empty(stack)) {  
                return false;  
            }  
            char right;  
            pop(stack, &right);  
            //左右括号开始匹配  
            if (left == ')' && right != '(') {  
                return false;  
            }  
            if (left == '}' && right != '{') {  
                return false;  
            }  
            if (left == ']' && right != '[') {  
                return false;  
            }  
        }  
  
    }  
    //最后的判断,栈匹配完毕之后就是空
    return empty(stack);  
}  
  
int main() {  
	//0表示false,1表示true
    bool flag = isValid("((");  
    printf("%d", flag);  
    return 1;  
}

[!info] 用栈实现括号匹配:

  1. 依次扫描所有字符
  2. 遇到左括号入栈
  3. 遇到右括号弹出栈顶元素
  4. 检查是否匹配
  5. 匹配失败的原因:
  6. 左括号单身
  7. 右括号单身
  8. 左右括号不匹配
  9. 最后记得判断栈是否为空

[!NOTE] 重点
一定一定要把基本的数据结构的那些操作在脑海中过一遍


  1. 可用“栈”实现该特性 ↩︎

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923610.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号