【每日算法】AB3 有效括号序列

本文介绍了一个使用栈实现括号匹配的有效算法。通过遍历输入字符串,遇到开括号将其压入栈中;遇到闭括号则检查栈顶是否为相应的开括号,以此来判断括号是否正确配对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param s string字符串
 * @return bool布尔型
 */
#include<string.h>

struct stack {
    int size;
    int top;
    char data[10001];
} stack;

void init(struct stack* sk) {
    sk->top = 0;
    sk->size = 0;
}

void push(struct stack* sk, char a) {
    sk->data[sk->top] = a;
    sk->size ++;
    sk->top ++;
}

char top(struct stack* sk) {
    return sk->data[sk->top - 1];
}

char pop(struct stack* sk) {
    sk->size --;
    sk->top --;
    return sk->data[sk->top];
}

bool isValid(char* s ) {
    int len = strlen(s);
    printf("len:%d\n", len);
    int point = 0;
    struct stack sk;
    init(&sk);
    for (int i = 0; i < len; i ++) {
        printf("round %d\n", i);
        switch(s[i]){
            case '(':
            case '[':
            case '{':
                push(&sk, s[i]);
                printf("push %c\n", s[i]);
                break;
            case ')':
                if(sk.size == 0 || top(&sk) != '('){
                    return false;
                }
                pop(&sk);
                printf("pop %c\n", s[i]);
                break;
            case ']':
                if(sk.size == 0 || top(&sk) != '['){
                    printf("sk.size %d top %c\n", sk.size, top(&sk));
                    return false;
                }
                printf("pop %c\n", s[i]);
                pop(&sk);
                break;
            case '}':
                if(sk.size == 0 || top(&sk) != '{'){
                    return false;
                }
                printf("pop %c\n", s[i]);
                pop(&sk);
                break;
            default:
                printf("unexpected\n");
                break;
        }
    }
    if (sk.size != 0) {
        return false;
    }
    return true;
}

思路

遍历字符数组,如果是 ‘(’ / ‘[’ / ‘{’,就压入栈中,如果是 ‘)’ / ‘]’ / ‘}’,若判断栈为空 / 栈顶不是对应的符号,返回false
遍历结束后,若栈为空,返回true,否则返回false

复习知识点

  1. C中用char*表示字符串,string库提供了一系列操作字符串的函数
    字符串的比较:strcmp
    字符串的长度:strlen
  2. printf打印单个字符:%c

总结

思路很简单,就是一些很基础的知识忘记了,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值