返回
栈的妙用:判断括号匹配是否配对
后端
2023-03-05 13:40:48
栈数据结构:掌握先进后出原理
栈是一种数据结构,遵循先进后出的原则 (LIFO)。这意味着,第一个进入栈的元素是最后一个离开栈的元素。它在计算机科学中广泛用于内存管理、函数调用和表达式求值等领域。
用栈判断括号匹配
用栈来判断括号匹配是否配对是一个经典的算法问题。给定一个包含左括号、右括号和其他字符的字符串,判断括号是否正确配对。例如,"()" 是匹配的,而 "([)]" 是不匹配的。
判断括号匹配的算法步骤如下:
- 初始化一个空栈。
- 遍历字符串中的每个字符。
- 如果当前字符是左括号,则将其压入栈中。
- 如果当前字符是右括号,则检查栈是否为空。如果栈为空,则字符串不匹配;否则,从栈中弹出栈顶元素,并检查其是否与当前字符匹配。如果匹配,则继续遍历字符串;否则,字符串不匹配。
- 遍历完字符串后,如果栈为空,则字符串匹配;否则,字符串不匹配。
代码实现
用栈来判断括号匹配的 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. 如何判断栈是否已满?
当栈顶指针达到栈的大小限制时,栈已满。