实现括号匹配检验的程序通常涉及到使用栈这一数据结构。栈是一种遵循后进先出(LIFO)原则的有序集合。在这个问题中,栈用于跟踪打开括号,以便与后来遇到的闭合括号进行匹配。
设计思想
- 初始化一个空栈:用于存放未匹配的左括号。
- 遍历输入字符串:逐字符检查。
- 如果是左括号(‘(’, ‘{’, ‘[’),则将其入栈。
- 如果是右括号(‘)’, ‘}’, ‘]’),则检查栈顶元素。
- 如果栈为空,或栈顶元素与当前右括号不匹配,则字符串不平衡,程序结束。
- 否则,从栈中弹出一个元素,表示找到了匹配的括号对。
- 字符串遍历完成后,检查栈:
- 如果栈为空,则所有括号正确匹配。
- 如果栈非空,则存在未匹配的左括号,字符串不平衡。
存储结构
使用数组模拟栈的存储结构。栈的主要操作包括:
- push:将一个元素放入栈顶。
- pop:从栈顶移除一个元素。
- top:获取栈顶元素(不移除)。
- isEmpty:检查栈是否为空。
程序实现
下面是使用C语言实现的程序代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 栈结构体定义
typedef struct {
char items[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 检查栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 入栈操作
void push(Stack *s, char item) {
if (s->top < MAX_SIZE - 1) {
s->items[++s->top] = item;
} else {
printf("Stack Full\n");
}
}
// 出栈操作
char pop(Stack *s) {
if (!isEmpty(s)) {
return s->items[s->top--];
} else {
printf("Stack Empty\n");
return -1; // 使用特殊值表示栈空
}
}
// 检查括号是否匹配
int isMatch(char open, char close) {
if (open == '(' && close == ')') return 1;
if (open == '{' && close == '}') return 1;
if (open == '[' && close == ']') return 1;
return 0;
}
// 主函数,括号匹配检验
int main() {
Stack s;
initStack(&s);
char expr[MAX_SIZE];
int valid = 1;
printf("Enter an expression with brackets: ");
scanf("%s", expr);
for (int i = 0; expr[i] != '\0' && valid; i++) {
if (expr[i] == '(' || expr[i] == '{' || expr[i] == '[') {
push(&s, expr[i]);
} else if (expr[i] == ')' || expr[i] == '}' || expr[i] == ']') {
if (isEmpty(&s) || !isMatch(pop(&s), expr[i])) {
valid = 0;
}
}
}
if (!isEmpty(&s)) valid = 0;
if (valid) {
printf("The expression is balanced.\n");
} else {
printf("The expression is not balanced.\n");
}
return 0;
}
流程图
由于文本格式的限制,下面简要描述了程序的流程图内容:
- 开始:启动程序。
- 初始化栈:创建一个空栈用于存储左括号。
- 输入字符串:用户输入包含括号的字符串。
- 遍历字符串:逐个字符检查字符串
。
- 左括号:将其入栈。
- 右括号:检查与栈顶元素的匹配性。
- 不匹配或栈空:标记为不平衡,结束遍历。
- 遍历完成:检查栈是否为空。
- 栈空:所有括号均匹配,输出匹配信息。
- 栈非空:存在未匹配的左括号,输出不匹配信息。
- 结束:程序完成执行。