括号匹配问题
1.题目
设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如({})或({([][()])})等均为正确的格式,而{[])}、{()]或([]}均为不正确的格式。
2.算法分析
3.
//
// Created by trmbh on 2023-09-11.
//
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define FALSE 0
#define TRUE 1
#define StackElementType char
typedef struct Node {
StackElementType data;
struct Node *next;
} LinkStackNode, *LinkStack;
/* 初始化栈区 */
void InitLinkStack(LinkStack *l) {
*l = (LinkStack) malloc(sizeof(LinkStackNode));
(*l)->next = NULL;
}
/* 入栈操作 */
int Push(LinkStack l, StackElementType x) {
LinkStackNode *temp;
temp = (LinkStackNode *) malloc(sizeof(LinkStackNode));
temp->data = x;
temp->next = l->next;
l->next = temp;
return TRUE;
}
/* 出栈操作 */
int Pop(LinkStack l, StackElementType *x) {
if (l->next == NULL) return FALSE;
LinkStackNode *temp;
temp = l->next;
l->next = temp->next;
*x = temp->data;
free(temp);
return TRUE;
}
/* 获得栈首数据 */
int GetTop(LinkStack l, StackElementType *x) {
if (l->next == NULL) return FALSE;
*x = l->next->data;
return TRUE;
}
/* 判断链栈是否为空 */
int IsEmpty(LinkStack l) {
if (!l->next) return TRUE;
else return FALSE;
}
/* 括号匹配函数 */
int BracketMatch(char *str, LinkStack l) {
StackElementType x;
while (*str != '\0') {
GetTop(l, &x);
switch (*str) {
case '{':
case '[':
case '(':
Push(l, *str);
break;
case '}':
if (x == '{') Pop(l, &x);
else return FALSE;
break;
case ']':
if (x == '[') Pop(l, &x);
else return FALSE;
break;
case ')':
if (x == '(') Pop(l, &x);
else return FALSE;
break;
}
str++;
}
if (IsEmpty(l)) {
return TRUE;
} else return FALSE;
}
int main() {
LinkStack l;
char str[100];
printf("请输入字符串:");
/* 第二个参数为最大字符数限制, 第三个参数为从标准输入流读入*/
fgets(str, sizeof(str), stdin); // 使用fgets接收输入
// 移除输入字符串中的换行符
size_t len = strlen(str);
if (len > 0 && str[len - 1] == '\n') {
str[len - 1] = '\0';
}
InitLinkStack(&l);
if (BracketMatch(str, l)) printf("匹配成功");
else printf("匹配失败");
return 0;
}