欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > 利用栈,实现括号匹配功能

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

2025/6/24 7:22:08 来源:https://blog.csdn.net/weixin_63164319/article/details/148857104  浏览:    关键词:利用栈,实现括号匹配功能

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

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)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词