栈的应用之括号匹配算法

2023-05-16

算法思路:

  • 初始化一个栈,命名为s

  • 依次遍历待匹配的字符串

    • 如果当前字符为左括号(即'(', '[', '{'中的任意一个),则将其入栈

    • 如果当前字符为右括号(即')', ']', '}'中的任意一个),则需要进行匹配检测

      • 若栈为空,则无法匹配,返回false

      • 否则,将栈顶元素与当前右括号进行匹配,如果匹配成功,则将栈顶元素出栈;如果匹配失败,则返回false

  • 若字符串中所有字符都已遍历完毕,则需要检测栈是否为空

    • 如果栈为空,则说明括号匹配成功,返回true

    • 否则,说明还有左括号未匹配到右括号,返回false

代码:

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

#define MaxSize 100  // 栈的最大容量

// 定义栈结构体
typedef struct {
    char data[MaxSize];
    int top;  // 栈顶指针
} Stack;

// 初始化栈
void init(Stack *s) {
    s->top = -1;  // 置空栈
}

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

// 判断栈是否已满
bool is_full(Stack *s) {
    return s->top == MaxSize - 1;
}

// 元素入栈
void push(Stack *s, char c) {
    if (is_full(s)) {
        printf("栈已满!\n");
        exit(EXIT_FAILURE);
    }
    s->top++;
    s->data[s->top] = c;
}

// 元素出栈
char pop(Stack *s) {
    if (is_empty(s)) {
        printf("栈为空!\n");
        exit(EXIT_FAILURE);
    }
    char c = s->data[s->top];
    s->top--;
    return c;
}

// 判断括号序列是否匹配
bool is_matched(char *str) {
    Stack s;
    init(&s);  // 初始化栈
    int i = 0;
    while (str[i] != '\0') {  // 遍历字符串
        if (str[i] == '(' || str[i] == '[' || str[i] == '{') {
            push(&s, str[i]);  // 左括号入栈
        } else if (str[i] == ')' || str[i] == ']' || str[i] == '}') {
            if (is_empty(&s)) {  // 栈为空,无法匹配
                return false;
            } else if ((str[i] == ')' && pop(&s) != '(') ||
                       (str[i] == ']' && pop(&s) != '[') ||
                       (str[i] == '}' && pop(&s) != '{')) {  // 栈顶元素与右括号不匹配
                return false;
            }
        }
        i++;
    }
    return is_empty(&s);  // 栈为空,则括号匹配成功,否则匹配失败
}

// 测试代码
int main() {
    char str[MaxSize];
    printf("请输入括号序列:");
    scanf("%s", str);
    if (is_matched(str)) {
        printf("括号匹配成功!\n");
    } else {
        printf("括号匹配失败!\n");
    }
    return 0;
}

效果图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈的应用之括号匹配算法 的相关文章

  • OpenMV识别色块与STM2F4通过串口通信

    花了三天时间学习了一下OpenMV的简单使用 xff0c 在这写个博客记录一下 xff0c 并且上传自己的代码 xff0c 以方便交流学习 第一次发帖 xff0c 不周之处见谅 首先概括一下我实现的功能 xff1a OpenMV识别红色色块
  • c++语言简单提问

    1 定义一个空的类型 xff0c 里面没有任何成员变量和成员函数 对该类型求sizeof xff0c 得到的结果是 1 2 为什么不是0 空类型的实例中不包含任何信息 xff0c 本来求sizeof应该是0 xff0c 但是当我们声名该类型
  • 二 ROS通信机制-话题通信(发布订阅模式)

    二 ROS通信机制 话题通信 发布订阅模式 ROS 中的基本通信机制2 1话题通信 发布订阅模式 2 1 1概念2 1 2作用2 1 3 理论模型2 1 4 话题通信应用时需要关注的地方 xff1a 3 简单实现3 1ROS工作空间建立 x
  • 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题

    解决ROS中运行launch文件报错ERROR cannot launch node of type xxx xxx xxx的问题 错误截图 xff1a 原因 xff1a 解决方式 xff1a 当时我出现的错误是 ERROR cannot
  • c++ stl 五种迭代器

    c 43 43 stl 五种迭代器 2010 12 31 14 22 25 分类 xff1a C 43 43 C 举报 字号 订阅 下载LOFTER 我的照片书 迭代器的分类 Iterator Categories I
  • C语言头文件中定义变量问题(转)

    上个星期回学校的时候 xff0c 刚好碰到一个学弟在写程序 xff0c 并且刚好碰到一个总编不过去的问题 xff0c 我看了看 xff0c 正好是个头文件重复包含问题 xff0c 问题描述如下 xff1a 他在程序中建立了一个global
  • Opencv Aruco识别(python)

    效果图 先上效果 代码 直接上代码 xff1a span class token operator span span class token operator span usr span class token operator span
  • Windows下Cmake安装步骤详解(图文)

    文章目录 Cmake介绍Cmake下载及安装 Cmake介绍 CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 xff0c 并且输出对应的makefile或者pro
  • C语言:通过指针模拟实现strcat函数

    模拟实现strcat strcat函数的功能 把src所指向的字符串 xff08 包括 0 xff09 复制到dest所指向的字符串后面 xff08 删除dest原来末尾的 0 xff09 要保证dest足够长 xff0c 以容纳被复制进来
  • C语言中将字符串拆分再进行拼接

    我们有时候需要对于字符串进行操作 xff0c 主要用到strcat和strtok两个函数 xff0c 因此记录下这次的操作方式以便之后查阅 span class token macro property span class token d
  • 并行编程实现矩阵乘法优化

    实现四种矩阵乘法程序 xff0c 并对比运行效率 1 xff09 串行算法 2 xff09 Catch优化 3 xff09 SSE版本 4 xff09 分片策略 span class token macro property span cl
  • c++的函数reserve()和unique()和sort()

    函数reserve span class token comment vector reserve span span class token macro property span class token directive keywor
  • 关于c中代码加 ‘\‘ 进行换行的说明

    我们在c与c 43 43 中经常会遇到一种情况就是加 进行换行来保持代码整体结构一致的使用情况 xff0c 那么具体来说换行的规则是什么 xff0c 这里进行一下记录 span class token macro property span
  • git的命令总结

    先把清单列出来git cheat sheet git 命令总结 git的init和git clonegit add和git commit 提交二连git checkout 反向操作git reset 回退HEAD指针git revert 同
  • 宏定义中的可变参数 __VA_ARGS__ 用法 与 #和##的用法

    首先了解一下可变参数 span class token macro property span class token directive keyword include span span class token string lt st
  • C++结构体简单链表原理解释

    对结构体简单链表原理的简单解释 xff0c 程序如下 xff1a struct lianbiao int no string name struct lianbiao next lianbiao head 61 nullptr tail 6
  • linux小连招

    Linux命令目录 查看当前shell的种类find命令查找文件 查看当前shell的种类 查看当前发行版可以使用的shell xff1a chao 64 chao span class token function cat span et
  • 侵略性奶牛(对于二分的总结)

    题目 Farmer John has built a new long barn with N 2 lt 61 N lt 61 100 000 stalls The stalls are located along a straight l
  • To Fill or Not to Fill(贪心算法)

    题目描述 有了高速公路 xff0c 开车从杭州到任何其他城市都很容易 但由于汽车的油箱容量有限 xff0c 我们必须不时地在路上找到加油站 不同的加油站可能会给出不同的价格 你被要求仔细设计最便宜的路线去 输入描述 对于每个测试实例 第一行

随机推荐