当前位置: 首页 > 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)

相关文章:

  • 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 多模块项目调试与问题排查总结
  • 信息网站的建设/seo外链是什么
  • 网站建站分为两种/网络推广方案设计
  • 公司简介概况怎么写/网站优化排名怎么做
  • 宁波高新区建设局网站/东莞网站推广运营公司
  • 马蜂窝网站做的重点/传媒公司
  • 成都企业网站建设哪家专业/宁波seo的公司联系方式