C语言 顺序栈实现括号匹配
时间: 2023-08-20 17:13:41 浏览: 138
好的,以下是 C 语言顺序栈实现括号匹配的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 100 // 栈的最大长度
typedef struct {
char data[MAXSIZE];
int top; // 栈顶指针
} Stack;
// 初始化栈
void InitStack(Stack *S) {
S->top = -1;
}
// 判断栈是否为空
bool IsEmpty(Stack *S) {
return S->top == -1;
}
// 判断栈是否已满
bool IsFull(Stack *S) {
return S->top == MAXSIZE - 1;
}
// 入栈
bool Push(Stack *S, char c) {
if (IsFull(S)) {
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 GetTop(Stack *S, char *c) {
if (IsEmpty(S)) {
return false;
}
*c = S->data[S->top];
return true;
}
// 判断是否为左括号
bool IsLeft(char c) {
return c == '(' || c == '[' || c == '{';
}
// 判断是否为右括号
bool IsRight(char c) {
return c == ')' || c == ']' || c == '}';
}
// 判断左右括号是否匹配
bool IsMatch(char left, char right) {
return (left == '(' && right == ')')
|| (left == '[' && right == ']')
|| (left == '{' && right == '}');
}
// 判断括号序列是否匹配
bool IsParenthesesMatch(char *str) {
Stack S;
InitStack(&S);
for (int i = 0; str[i] != '\0'; i++) {
if (IsLeft(str[i])) {
// 左括号入栈
Push(&S, str[i]);
} else if (IsRight(str[i])) {
// 右括号与栈顶元素匹配则出栈
char top;
if (!Pop(&S, &top) || !IsMatch(top, str[i])) {
return false;
}
}
}
// 括号序列匹配当且仅当栈为空
return IsEmpty(&S);
}
int main() {
char str[MAXSIZE];
printf("请输入括号序列:");
scanf("%s", str);
if (IsParenthesesMatch(str)) {
printf("括号序列匹配\n");
} else {
printf("括号序列不匹配\n");
}
return 0;
}
```
代码的思路是:遍历括号序列,若是左括号则入栈,若是右括号则与栈顶元素匹配,若匹配则将栈顶元素出栈,否则返回不匹配。最后判断栈是否为空,若为空则括号序列匹配,否则不匹配。
阅读全文