括号匹配问题

发布时间 2023-09-11 17:56:09作者: DawnTraveler

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;
}