当前位置: 首页 > news >正文

简单括号匹配_栈

 课程笔记 10:数据结构(清华) 栈_opnd push-CSDN博客

括号匹配。对于一个表达式,要想确认其中所使用的括号是否匹配,可以采用减而治之的思路,将每对邻近括号消去,则剩下的达式括号匹配当且仅当原表达式括号匹配。利用这一思路,我们可以采用栈结构来实现:

bool paren (const char exp[], int n){

Stack S;int j = 0;

for (int i = 0; i < n; i ++){

        if (exp[i] == '(') S.push(++ j);

        if (!S.empty() && (exp[i] == ')'))S.pop();

        if (S.empty() && (exp[i] == ')'))return false;

}

return S.empty();}
 

#include <stdio.h>

// 括号匹配函数
int paren(const char exp[]) {
    int stack[1000] = {0};
    int top = -1;
    for (int i = 0; exp[i] != '\0'; i++) {
        if (exp[i] == '(')stack[++top] = 1;
        else if (exp[i] == ')') {
            if (top >= 0) top--;
            else return 0;
        }
    }
    return top == -1;
}

int main() {
    char exp[1000];
    gets(exp);
    if (paren(exp))  printf("括号匹配\n");
    else  printf("括号不匹配\n");
    
    return 0;
}

#include <stdio.h>
#include <stdlib.h>

// 定义栈结构
typedef struct Stack {
    int *data;
    int top;
    int capacity;
} Stack;

// 初始化栈
void initStack(Stack *s, int capacity) {
    s->data = (int *)malloc(capacity * sizeof(int));
    s->top = -1;
    s->capacity = capacity;
}

// 入栈操作
void push(Stack *s, int value) {
    if (s->top < s->capacity - 1) {
        s->data[++(s->top)] = value;
    }
}

// 出栈操作
int pop(Stack *s) {
    if (s->top >= 0) {
        return s->data[(s->top)--];
    }
    return -1;  // 表示栈为空,无元素可出栈
}

// 判断栈是否为空
int isEmpty(Stack *s) {
    return s->top == -1;
}

// 括号匹配函数
int paren(const char exp[], int n) {
    Stack S;
    initStack(&S, n);  // 初始化栈,大小为表达式长度

    for (int i = 0; i < n; i++) {
        if (exp[i] == '(') {
            push(&S, 1);  // 这里入栈的值可以是任意值,仅用于标记左括号
        } else if (exp[i] == ')') {
            if (!isEmpty(&S)) {
                pop(&S);
            } else {
                // 右括号多了,直接返回 0 表示不匹配
                free(S.data);
                return 0;
            }
        }
    }

    int result = isEmpty(&S);  // 判断栈是否为空,为空则括号匹配
    free(S.data);  // 释放栈内存
    return result;
}

int main() {
    char exp[1000];
    fgets(exp, sizeof(exp), stdin);  // 读取表达式,包含换行符
    int len = 0;
    while (exp[len] != '\n' && exp[len] != '\0') {
        len++;
    }

    int match = paren(exp, len);
    if (match) {
        printf("括号匹配\n");
    } else {
        printf("括号不匹配\n");
    }

    return 0;
}

相关文章:

  • 代码随想录算法训练营第十四天
  • UniApp 实现兼容 H5 和小程序的拖拽排序组件
  • Django项目入门二
  • ShopXO v2.2.4开源商城手动部署(保姆级)+异常处理
  • 分支语句和循环语句
  • 蓝桥杯刷题--宝石组合
  • 【踩坑】GitHub Actions 运行的 Linux 环境中,文件名是大小写敏感的
  • 基于SpringBoot的“线上考试系统”的设计与实现(源码+数据库+文档+PPT)
  • AWS VPC深度解析:构建安全可靠的云网络基础设施
  • Java中的基本数据类型
  • HarmonyOS:组件布局保存至相册
  • repo安装配置
  • 一文读懂WPF系列之常用控件以及样式
  • Human3.6M 解析3d pose标注 h36m
  • python基础语法13-装饰器
  • 【JavaScript】十七、事件委托(冒泡阶段的利用)
  • Redux中间件原理
  • 水文-用 Coze 工作流打造你的自媒体写作工厂
  • OpenHarmony子系统开发 - 热管理(二)
  • ​​亚马逊算法重构消费市场:解码2024年Q1北美站热搜商品的底层逻辑​