一道简单的关于栈的题目
C语言解法
c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int isMatch(char left, char right) {
return (left == '(' && right == ')') ||
(left == '{' && right == '}') ||
(left == '[' && right == ']');
}
int isValid(char* s) {
if (s == NULL) return 0;
int len = strlen(s);
if (len == 0) return 1;
// 动态分配堆内存(避免栈溢出)
char* stack = (char*)malloc(len * sizeof(char));
if (stack == NULL) return 0; // 内存分配失败
int top = -1;
for (int i = 0; i < len; i++) {
char c = s[i];
if (c == '(' || c == '{' || c == '[') {
top++;
stack[top] = c;
} else if (c == ')' || c == '}' || c == ']') {
if (top == -1) {
free(stack); // 提前释放内存,避免泄漏
return 0;
}
if (isMatch(stack[top], c)) {
top--;
} else {
free(stack);
return 0;
}
} else {
free(stack);
return 0;
}
}
int result = (top == -1) ? 1 : 0;
free(stack); // 释放堆内存
stack = NULL; // 置空野指针
return result;
}
java解法
java
class Solution {
public boolean isValid(String s) {
// 第四步:剪枝校验1 - 空字符串直接判定为有效(题目规则)
if (s == null || s.length() == 0) {
return true;
}
// 第五步:剪枝校验2 - 字符串长度为奇数直接返回false
// 原因:括号必须成对出现,奇数长度必然有单个括号无法匹配,无需后续遍历
if (s.length() % 2 != 0) {
return false;
}
// 第六步:初始化栈结构,用于暂存未匹配的左括号
// Stack<Character> 表示栈中存储的是字符类型(Character是char的包装类)
Stack<Character> stack = new Stack<Character>();
// 第七步:遍历字符串的每个字符(增强for循环,比普通for更简洁)
// s.toCharArray() 将字符串转为字符数组,方便逐个遍历
for (char c : s.toCharArray()) {
// 第八步:处理左括号 - 遇到(、[、{直接入栈暂存
// 原因:左括号需要等待后续对应的右括号匹配,栈的"后进先出"特性适配括号顺序
if (c == '(' || c == '[' || c == '{') {
stack.push(c); // push(c):将当前左括号压入栈顶
}
// 第九步:处理右括号) - 单独判断,避免多条件混写
else if (c == ')') {
// 子步骤1:栈为空 → 无对应的左括号匹配,直接返回false
// 子步骤2:栈不为空则弹出栈顶元素,判断是否是(,不是则匹配失败
// 注意:char强制类型转换,因为stack.pop()返回的是Object类型
if (stack.empty() || (char) stack.pop() != '(') {
return false;
}
}
// 第十步:处理右括号] - 逻辑和)完全一致
else if (c == ']') {
if (stack.empty() || (char) stack.pop() != '[') {
return false;
}
}
// 第十一步:处理右括号} - 逻辑和)、]完全一致
else if (c == '}') {
if (stack.empty() || (char) stack.pop() != '{') {
return false;
}
}
}
// 第十二步:最终校验 - 遍历结束后栈必须为空才有效
// 原因:栈不为空说明有未匹配的左括号(如"(()"遍历后栈剩一个()
return stack.empty();
}
}