Leetcode(力扣) 20.有效的括号。(栈的初步应用)
1.题目描述
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
2.解题思路
所给括号有以下特点:最先给出的括号最后配对,后给出的括号先配对;
这与栈的模型类似,先进后出,后进先出。
3.预备知识,初步认识栈
栈是一种数据结构,类似于乒乓球桶,先放入的东西最后拿出。
先进后出是关键
栈的数组实现:
我们需要一个数 top 指代栈顶的位置,初始为-1;
栈的主要操作有输入与取出
输入
push(char b)
{
top++;
stack[top]=b;//top值加一,栈顶加一
}
取出
pop()
{
top--;栈顶减一相当于退出最上面的内容
}
理解基础知识后我们继续看题目
4.实现题目要求
具体实现过程如下
1.如果是 (,[,{,则压入栈,
2.如果是 ),],},如果栈为空直接错误,否则进行判断,是否与栈顶的括号配对,如果配对的话,取出(栈顶减一),如果不配对则返回错误。
3.结束后判断栈内数据是否为0(top=-1),若是说明全部配对,否则说明出现错误
举个例子
:
示例
{()[()]}
1.初始栈顶为-1
{ 为左括号,插入栈中:stack:{, top=0
2.(为左括号,插入栈中:stack:{(,top=1
3.)为右括号,判断栈顶数据是否同型,栈顶为 ( 与 ) 配对,所以top-1=0;
4.[为左括号,插入:stack: { [,top=1;
5(为左括号,插入:stack:{,[,(,top=2;
6.)为右括号,对比发现可以配对,top=1,stack: {,[;
7.]为右括号,对比发现可以配对,stack:{,top=0;
8,同上,stack:,top=-1
结束发现top为-1栈空说明全部配对,示例通过。
5.具体代码
int classify(char a);//函数用来判断是否同类型
bool isValid(char * s){
int len=strlen(s);
int i=0,top=-1;
char stack[100000]={0};
for(i=0;i<len;i++)//进行 len 次循环,遍历所给示例
{
if(s[i]=='('||s[i]=='{'||s[i]=='[')
{
top++;
stack[top]=s[i];
}
else
{
if(top==-1)
return false;//如果说出现反括号而栈内为空直接为错
else{
if(classify(s[i])==classify(stack[top]))
{
top--;
}
else
return false;
}
}
}
if(top==-1)
return true;
else
return false;
}
int classify(char a)
{
int num;
if(a=='('||a==')')
num=1;
if(a=='['||a==']')
num=2;
if(a=='{'||a=='}')
num=3;
return num;
}
6.总结
该题目应用了栈的基础知识,用先进后出的类型联想到栈的结构进行解题