IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构和算法之栈的应用:括号匹配 -> 正文阅读

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

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 代码展示区

/**  
 * @author five-five * @created 2022/5/20 * */#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. 可用“栈”实现该特性 ??

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-26 15:23:34  更:2022-05-26 15:23:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:09:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码