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

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. 可用“栈”实现该特性 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

five-five

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

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

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

打赏作者

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

抵扣说明:

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

余额充值