题记(33)--括号匹配(栈的应用)

目录

一、题目内容

二、输入描述

三、输出描述

四、输入输出示例

五、完整C语言代码


一、题目内容

请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。

二、输入描述

有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。

三、输出描述

对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。

四、输入输出示例

输入:

4
[(d+f)*{}]
[(2+3))
()}
[4(6]7)9

输出:

yes
no
no
no

五、完整C语言代码

AC代码~
#include
#include

char stack[1000]; // 栈进行括号匹配
int top = -1;       // 栈顶指针

void IsMatch(char s[], int n) {
    int i = 0;
    int flag = 1;  // flag:1:匹配 0:不匹配
    while (i < n) {
        if (s[i] == '[' || s[i] == '{' || s[i] == '(') {
            top++;
            stack[top] = s[i];
            i++;
        } else if (s[i] == ']' || s[i] == '}' || s[i] == ')') {
            if (top == -1) {
                flag = 0;
                break;
            }
            char stack_top = stack[top];
            top--;
            if ((s[i] == ']' && stack_top != '[') || (s[i] == '}' && stack_top != '{') ||
                    (s[i] == ')' && stack_top != '(')) {
                flag = 0;
                break;
            }
            i++;
        } else
            i++;
    }
    if (top != -1) // 不要忘记,循环结束后若栈不为空则不匹配
        flag = 0;
    if (flag == 1)
        printf("yes\n");
    else
        printf("no\n");
}

int main() {
    int N;
    char s[1000];
    while (scanf("%d", &N) != EOF) {
        char c = getchar();
        for (int i = 0; i < N; i++) {
            top = -1;
            gets(s);
            int len = strlen(s);
            IsMatch(s, len);
        }
    }
    return 0;
}

你可能感兴趣的:(算法,c++)