初始化括号存储栈,遍历字符串,如果是左括号,入栈;如果是右括号,栈顶元素出栈,匹配失败就终止,匹配成功无事发生。扫描到右括号时如果栈空,右括号“单身”,匹配不成功!
遍历完成后,如果栈非空,有左括号“单身”,匹配不成功!
下面是一个完整的使用C语言实现括号匹配动画展示的代码示例,其中使用了栈结构:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_SIZE 100
// 定义栈结构
typedef struct {
char stack[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack* s) {
return s->top == MAX_SIZE - 1;
}
// 入栈
void push(Stack* s, char c) {
if (isFull(s)) {
printf("栈已满,无法入栈。\n");
return;
}
s->stack[++s->top] = c;
}
// 出栈
char pop(Stack* s) {
if (isEmpty(s)) {
printf("栈为空,无法出栈。\n");
return '\0';
}
return s->stack[s->top--];
}
// 获取栈顶元素
char peek(Stack* s) {
if (isEmpty(s)) {
return '\0';
}
return s->stack[s->top];
}
// 清空输入缓冲区
void clearInputBuffer() {
char c;
while ((c = getchar()) != '\n') {}
}
// 动画展示括号匹配过程
void animateParenthesesMatching(const char* expression) {
Stack s;
initStack(&s);
int len = strlen(expression);
for (int i = 0; i < len; i++) {
char c = expression[i];
if (c == '(' || c == '[' || c == '{') {
push(&s, c);
} else if (c == ')' || c == ']' || c == '}') {
if (isEmpty(&s)) {
printf("括号不匹配!\n");
return;
} else {
char top = pop(&s);
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
printf("括号不匹配!\n");
return;
}
}
}
// 清屏
system("clear");
// 打印当前字符串和栈状态
printf("%s\n", expression);
for (int j = 0; j < i + 1; j++) {
printf(" ");
}
printf("^\n");
printf("当前栈状态:");
for (int j = 0; j <= s.top; j++) {
printf("%c", s.stack[j]);
}
printf("\n");
// 等待一段时间,展示动画效果
usleep(500000);
}
// 判断最终栈是否为空
if (isEmpty(&s)) {
printf("括号完全匹配!\n");
} else {
printf("括号不匹配!\n");
}
}
int main() {
char expression[MAX_SIZE];
printf("请输入包含括号的表达式:");
fgets(expression, MAX_SIZE, stdin);
expression[strcspn(expression, "\n")] = '\0'; // 去除fgets末尾的换行符
animateParenthesesMatching(expression);
return 0;
}
```
以上是一个完整的使用C语言实现括号匹配动画展示的程序。程序中首先定义了栈结构`Stack`,包含一些栈操作函数。然后,在`animateParenthesesMatching()`函数中,根据输入的表达式逐个字符进行处理,并通过栈判断是否括号匹配。在循环过程中,程序清屏,并打印当前字符串和栈状态,以及箭头指示当前处理位置。通过设置适当的延时,实现动画效果。最后,判断最终栈状态,输出括号匹配结果。
在主函数`main()`中,用户可以输入包含括号的表达式,并调用`animateParenthesesMatching()`函数进行括号匹配过程的动画展示。
请注意,此示例代码可能在不同的操作系统环境下有所差异。例如,清屏操作`system("clear")`在Windows系统下应改为`system("cls")`。