最近在学数据结构结构,正好刚刚学过栈的知识点,做到题目来练习一下
因为我主要是练习一下我数据结构所学知识,可能我的方法不是很完美和简便。
题目:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
题解:
思路就是:
第一步:创建一个栈用来存储数据,通过top1来实现入栈出栈;我这里的栈是通过顺序存储结构来建立的。
第二步:从左玩右扫描,如果是’(’,’{’,’[’,则入栈,++top;
第三步:如果是’)’,’}’,’]'则将栈顶元素和扫描到元素相匹配,则栈顶元素出栈,然后继续进行扫描;如果他们不匹配的话,则输出false。
第四步:扫描完成,如果top>-1,则栈里面还有元素,则输出false;如果top==-1则栈空,输出true。
代码:
class Solution {
public:
bool isValid(string s) {
char a[100000];
int top=-1;
for(int i=0;i<s.size();i++){
if(s[i]=='('||s[i]=='['||s[i]=='{'){
a[++top]=s[i];
}else{
if(top==-1)
return false;
char left=a[top--];
if(sub(left,s[i])==0){
return false;
}
}
}
if(top>-1){
return false;
}
return true;
}
//用来检测是否括号是否匹配
int sub(char left,char right){
if(left=='('&&right==')')
{
return 1;
}else if(left=='['&&right==']')
{
return 1;
}else if(left=='{'&&right=='}')
{
return 1;
}else{
return 0;
}
}
};
结果通过:
自定义的一个int类型,top指向被看出栈的栈顶。 ↩︎