返回

栈的妙用:判断括号匹配是否配对

后端

栈数据结构:掌握先进后出原理

栈是一种数据结构,遵循先进后出的原则 (LIFO)。这意味着,第一个进入栈的元素是最后一个离开栈的元素。它在计算机科学中广泛用于内存管理、函数调用和表达式求值等领域。

用栈判断括号匹配

用栈来判断括号匹配是否配对是一个经典的算法问题。给定一个包含左括号、右括号和其他字符的字符串,判断括号是否正确配对。例如,"()" 是匹配的,而 "([)]" 是不匹配的。

判断括号匹配的算法步骤如下:

  1. 初始化一个空栈。
  2. 遍历字符串中的每个字符。
  3. 如果当前字符是左括号,则将其压入栈中。
  4. 如果当前字符是右括号,则检查栈是否为空。如果栈为空,则字符串不匹配;否则,从栈中弹出栈顶元素,并检查其是否与当前字符匹配。如果匹配,则继续遍历字符串;否则,字符串不匹配。
  5. 遍历完字符串后,如果栈为空,则字符串匹配;否则,字符串不匹配。

代码实现

用栈来判断括号匹配的 C 代码实现如下:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct Stack {
    int top;
    char items[MAX_SIZE];
} Stack;

void push(Stack *s, char item) {
    if (s->top == MAX_SIZE - 1) {
        printf("Stack is full.\n");
        return;
    }
    s->items[++s->top] = item;
}

char pop(Stack *s) {
    if (s->top == -1) {
        printf("Stack is empty.\n");
        return -1;
    }
    return s->items[s->top--];
}

int is_matching_pair(char opening, char closing) {
    if (opening == '(' && closing == ')') {
        return 1;
    } else if (opening == '{' && closing == '}') {
        return 1;
    } else if (opening == '[' && closing == ']') {
        return 1;
    } else {
        return 0;
    }
}

int is_balanced(char *str) {
    Stack s;
    s.top = -1;

    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] == '(' || str[i] == '{' || str[i] == '[') {
            push(&s, str[i]);
        } else if (str[i] == ')' || str[i] == '}' || str[i] == ']') {
            if (s.top == -1) {
                return 0;
            }
            char popped_char = pop(&s);
            if (!is_matching_pair(popped_char, str[i])) {
                return 0;
            }
        }
    }

    if (s.top == -1) {
        return 1;
    } else {
        return 0;
    }
}

int main() {
    char str1[] = "()";
    char str2[] = "([)]";
    char str3[] = "{[()]}";
    char str4[] = "{[()]";

    printf("%s is %s balanced.\n", str1, is_balanced(str1) ? "" : "not");
    printf("%s is %s balanced.\n", str2, is_balanced(str2) ? "" : "not");
    printf("%s is %s balanced.\n", str3, is_balanced(str3) ? "" : "not");
    printf("%s is %s balanced.\n", str4, is_balanced(str4) ? "" : "not");

    return 0;
}

常见问题解答

1. 栈与队列有什么区别?

栈遵循先进后出 (LIFO) 原理,而队列遵循先进先出 (FIFO) 原理。

2. 栈可以用数组或链表实现吗?

是的,栈可以用数组或链表实现。数组实现简单高效,但大小固定。链表实现没有大小限制,但操作更复杂。

3. 用栈判断括号匹配的时间复杂度是多少?

O(n),其中 n 是字符串中的字符数。

4. 栈在计算机科学中还有哪些应用?

  • 内存管理
  • 函数调用
  • 表达式求值
  • 编译器
  • 虚拟机

5. 如何判断栈是否已满?

当栈顶指针达到栈的大小限制时,栈已满。