当前位置: 首页 > 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.lqws.cn/news/487729.html

相关文章:

  • OVS Faucet练习(下)
  • 百胜软件胜券AI:打造智慧零售运营新范式
  • 预训练语言模型基础知识概述
  • 使用Vue重新构建应用程序
  • PDF-XSS
  • xss利用meta强制跳转 CPS report-uri 报错泄露利用 -- GPN CTF 2025 Free Parking Network 1 2
  • 设计模式 - 抽象工厂
  • Perl 正则表达式
  • Chromium 136 编译指南 macOS篇:编译优化技巧(六)
  • 苹果芯片macOS安装版Homebrew(亲测)
  • “自动化失败归因”测试集-WhoWhen
  • RealSense 相机 | 读取IMU | 解决权限问题 | 提供示例程序
  • 【无刷电机FOC进阶基础准备】【04 clark变换、park变换、等幅值变换】
  • Python Django全功能框架开发秘籍
  • 五分钟了解@ExcelIgnoreUnannotated注解
  • Bug闭环解决之道:主流Bug追踪工具优劣对比
  • 月球上基于分段的全局定位
  • 【BFS】P9126 [USACO23FEB] Moo Route II S|普及+
  • MCU双分区方案,如何优雅地获知当前运行分区?
  • 纯血HarmonyOS5 打造小游戏实践:绘画板(附源文件)
  • 【基础篇-消息队列】——详解 RocketMQ 和 Kafka 的消息模型
  • 7.4.2B+树
  • 红帽全球副总裁曹衡康:开源AI开启企业级应用新纪元
  • 详解HarmonyOS NEXT仓颉开发语言中的全局弹窗
  • Android 中查看数据库内容方式
  • vue-23(创建用于逻辑提取的可重用组合组件)
  • Linux-系统管理
  • Java面试题027:一文深入了解数据库Redis(3)
  • 【Linux指南】文件管理高级操作(复制、移动、查找)
  • 学习Linux进程冻结技术