栈的应用括号匹配

介绍

栈可以做一些有意思的应用,例如括号的匹配。在编写 C 程序中,编译器可以检测括号是否匹配,以及哪里匹配错误。这可以轻松的使用栈来实现。

实现

当读取到左括号的时候入栈(Push),当读取到右括号的时候,将弹出栈顶元素进行比较,检测是否是匹配的符号。如果全部匹配并且栈为空,则括号匹配,否则不匹配。

代码

代码使用数组栈,定义最大栈容量为 20。

/*
    字符匹配程序,利用数组栈实现。
    匹配 ( [ { 这三种字符
*/
// 引入栈的头文件
#include "squenceStack.h"
#include<string.h>
// 定义最大栈长度
#define MAX 20
int main(void) {
    // 创建一个栈
    Stack stack;
    stack = CreateStack(MAX);

    char input[20];
    printf("请输入一串字符,以回车结束:");
    scanf("%s", input);
    printf("你输入了 %s,长度为len=%d\n", input, strlen(input));
    int i = 0;
    for (i = 0; input[i] != '\0'; i++)
    {
        int iswrong = 0;
        //如果是左括号,则入栈
        if (input[i] == '(' || input[i] == '[' || input[i] == '{') {
            Push(input[i], stack);
        } else {
            switch (input[i])
            {
            case ')':
                // 如果匹配,并且出栈成功(未到栈底)
                if (Top(stack) == '(' && Pop(stack) == 1)
                    ;
                // 否则出错
                else
                    iswrong = 1;
                break;
            case ']':
                if (Top(stack) == '[' && Pop(stack) == 1)
                    ;
                else
                    iswrong = 1;
                break;
            case '}' :
                if (Top(stack) == '{' && Pop(stack) == 1)
                    ;
                else
                    iswrong = 1;
                break;
            // 其他字符则跳过
            default:
                break;
            }
        }
        /* 如果任何错误发生,则退出循环 */
        if (iswrong == 1) {
            break;
        }
    }
    // 如果字符读取完毕,并且栈为空,则符号匹配
    if (input[i] == '\0' && IsEmpty(stack)) {
        printf("符号匹配!\n");
    } else {
        printf("匹配错误!\n");
    }
    return 0;
}

最后修改于 2021-07-12