目录
题面:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
代码:
// 手搓的栈
// 支持动态增长的栈
typedef char STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps);
// 初始化栈
void StackInit(Stack* ps)
{
ps->_a = (STDataType*)malloc(sizeof(STDataType)*4);
ps->_top = 0;
ps->_capacity = 4;
}
// 入栈
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if (ps->_top == ps->_capacity)
{
ps->_capacity *= 2;
STDataType* tmp = (STDataType*)realloc(ps->_a,sizeof(STDataType) * ps->_capacity);
ps->_a = tmp;
}
ps->_a[ps->_top] = data;
ps->_top++;
}
// 出栈
void StackPop(Stack* ps)
{
assert(ps);
assert(ps->_top != 0);
(ps->_top)--;
}
// 获取栈顶元素
STDataType StackTop(Stack* ps)
{
assert(ps);
return ps->_a[ps->_top - 1];
}
// 检测栈是否为空,如果为空返回1,如果不为空返回0
int StackEmpty(Stack* ps)
{
assert(ps);
return ps->_top == 0 ? 1 : 0;
}
// 上面是手搓的栈,c++的可以直接使用库函数,而c语言只能手搓
bool isValid(char* s) {
int ret=0; // 用于判别结果对不对,如果在判断过程中发现不匹配,ret就会改成1
Stack st;// 创建栈
StackInit(&st);//初始化栈
while(*s!='\0')
{
if(*s=='('||*s=='['||*s=='{') // 让所有的左括号入栈
{
StackPush(&st,*s);
s++;
}
else // 遇到右括号就去栈里面匹配,匹配不上就ret=1
{
if(StackEmpty(&st)!=0) // 如果没有左括号,直接判错
{
ret=1;
break;
}
if(*s==')'&& StackTop(&st)!='(')
{
ret=1;
break;
}
if(*s==']'&& StackTop(&st)!='[')
{
ret=1;
break;
}
if(*s=='}'&& StackTop(&st)!='{')
{
ret=1;
break;
}
StackPop(&st);//说明都匹配上了,拿掉栈顶元素
s++;//指针后移
}
}
if(StackEmpty(&st)==0) // 检查栈是否为空,不为空说明剩下了左括号
ret=1;
// 输入答案
if(ret==0)
return true;
else
return false;
}
思路解析:
题给字符串指针*s指向字符串首字符,已知字符串不为空,也就不用判空了,题里也说了字符只限定“{}()[]”这六个,因此可以只用if判断做题
1. 用if判断*s都是什么字符,如果是左括号直接入栈,作为待匹配字符
2. 如果是右括号,就去栈里面找最近入栈的左括号,看看能不能匹配
这里的括号匹配的规则是遇到右括号就要和做括号匹配。
形象一点就是:
“( { [ ] } )”√
“( { [ ) } ]“×
“( }”×
“( ( ( { { { [ [ [ ] ] ] } } } ) ) )”√
虽然每个括号都能匹配,但是人家定的规则就是“就近匹配”,理解了这一点就不成问题了
还有比较重要的一点就是利用栈的特点:后进先出,最后一个元素先出来