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

利用栈,实现括号匹配功能

利用栈,实现括号匹配功能,例:"()"匹配成功,"([]"匹配失败

main.c

#include "stack.h"int main() {char testCases[][MAX_LENGTH] = {"()", "(]", "([)]", "{[]}", "((())", ""};int numCases = sizeof(testCases) / sizeof(testCases[0]);for (int i = 0; i < numCases; i++) {printf("表达式 '%s': %s\n", testCases[i], isBalanced(testCases[i]) ? "匹配成功" : "匹配失败");}return 0;
}    

stack.h

#ifndef __STACK_H__
#define __STACK_H__#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>#define MAX_LENGTH 100typedef struct {char data[MAX_LENGTH];int top;
} Stack;void initStack(Stack *s);
bool isEmpty(Stack *s);
bool push(Stack *s, char c);
bool push(Stack *s, char c);
bool peek(Stack *s, char *c);
bool isLeftBracket(char c);
bool isRightBracket(char c);
bool isMatchingPair(char left, char right) ;
bool isBalanced(char *expression);#endif

stack.c

#include "stack.h"// 初始化栈
void initStack(Stack *s) {s->top = -1;
}// 判断栈是否为空
bool isEmpty(Stack *s) {return s->top == -1;
}// 入栈操作
bool push(Stack *s, char c) {if (s->top >= MAX_LENGTH - 1) {return false; // 栈溢出}s->data[++(s->top)] = c;return true;
}// 出栈操作
bool pop(Stack *s, char *c) {if (isEmpty(s)) {return false; // 栈为空}*c = s->data[(s->top)--];return true;
}// 获取栈顶元素
bool peek(Stack *s, char *c) {if (isEmpty(s)) {return false; // 栈为空}*c = s->data[s->top];return true;
}// 判断字符是否为左括号
bool isLeftBracket(char c) {return c == '(' || c == '[' || c == '{';
}// 判断字符是否为右括号
bool isRightBracket(char c) {return c == ')' || c == ']' || c == '}';
}// 判断左右括号是否匹配
bool isMatchingPair(char left, char right) {switch (left) {case '(': return right == ')';case '[': return right == ']';case '{': return right == '}';default: return false;}
}// 检查表达式括号是否匹配
bool isBalanced(char *expression) {Stack s;initStack(&s);int len = strlen(expression);for (int i = 0; i < len; i++) {char c = expression[i];if (isLeftBracket(c)) {if (!push(&s, c)) {printf("错误:栈溢出\n");return false;}} else if (isRightBracket(c)) {char topChar;if (!pop(&s, &topChar)) {return false; // 没有匹配的左括号}if (!isMatchingPair(topChar, c)) {return false; // 括号类型不匹配}}}return isEmpty(&s); // 栈为空表示所有括号都匹配
}

makefile

EXE=stack
Objs=$(patsubst %.c,%.o,$(wildcard *.c))
CC=gcc
CFlags=-c -oall:$(EXE)
$(EXE):$(Objs)$(CC) $^ -o $@
%.o:%.c$(CC) $^ $(CFlags) $@
.PHONY:clean                                   
clean:rm $(EXE) $(Objs)

http://www.dtcms.com/a/257687.html

相关文章:

  • vtkImageData去噪——vtkImageMedian3D
  • 板凳-------Mysql cookbook学习 (十--9)
  • 带约束的高斯牛顿法求解多音信号分离问题
  • GPIO-LED驱动
  • FPGA基础 -- Verilog 验证平台
  • Kimi“新PPT助手” ,Kimi全新自研的免费AI生成PPT助手
  • Android 编译和打包image镜像流程
  • RS485
  • 用于算法性能预测的 GNN 框架
  • 在Ubuntu上设置Firefox自动化测试环境:指定Marionette端口号
  • 【Comosl教程】如何计算物体所受到的力矩——质心积分法
  • 微信小程序:选择页面单选实现(多页面均可选择)
  • 探秘 Java 安全利器 ——JVMTI
  • 从哈希到挑战响应,密码传输安全解析
  • 《去哪儿网Redis高并发实战:从问题定位到架构升级》
  • RK3288 android7.1 将普通串口设置为调试串口
  • 从ConstraintLayout到Jetpack Compose:全面掌握Android UI设计与布局技术
  • 广东省专升本英语形容词与副词全梳理
  • ​​FFmpeg命令全解析:三步完成视频合并、精准裁剪​​、英伟达显卡加速
  • Maven 多模块项目调试与问题排查总结
  • 自动化 UI 测试智能体在 Trae 平台的部署体验
  • FPGA基础 -- Verilog 竞争/竞态(Race Condition)
  • AI辅助编程工具技术评估(2025年):CodeBuddy在开发者生态中的差异化优势分析
  • Stable Diffusion 项目实战落地:AI绘画与文案创作的魔法 第一篇 ——让你的小说推文秒变视觉与故事双料爆款!
  • 用 Makefile 自动生成详解:从零到精通的硬核指南
  • 在 AI 工具海洋中掌舵:Cherry Studio 如何成为你的统一指挥中心
  • 使用CloudFormation模板自动化AWS基础设施的部署
  • 韩国证券交易所(KRX)全生态接入系统技术白皮书
  • [2025CVPR]DeepLA-Net:深度局部聚合网络解析
  • sublime 4200 激活