有效括号字符串中最后出现的左括号最先被匹配(LIFO),可以用“栈”实现该特点。
循环遍历字符串,遇到左括号压入栈中,遇到右括号就“消耗”一个左括号(栈顶出栈),检查两个字符是否匹配,如果匹配继续往后遍历;不匹配则字符串无效。遇到右括号,如果此时栈为空--右括号单身。字符串已经遍历完毕,如果此时栈非空--左括号单身。
class Solution {
public:
#define MaxSize 10000
//定义栈
typedef struct {
char data[MaxSize];
int top;
}Sqstack;
//初始化栈
void InitStack(Sqstack &stack)
{
stack.top=0;
}
//判断是否为空
bool IsEmpty(Sqstack stack)
{
if(stack.top==0)
{
return true;
}else{
return false;
}
}
//入栈
bool push(Sqstack &stack,char e)
{
if(stack.top==MaxSize)
{
return false;
}
stack.data[stack.top++]=e;
return true;
}
//出栈
bool pop(Sqstack &stack,char &c)
{
if(IsEmpty(stack))
{
return false;
}
c=stack.data[--stack.top];
return true;
}
//是否有效
bool isValid(string s){
Sqstack stack;
InitStack(stack);
char u;
//长度不可为单数
if(s.length()%2!=0){
return false;
}
for(int i=0;i<s.length();i++) {
//遇到左括号入栈,右括号出栈
if(s[i]=='('||s[i]=='{'||s[i]=='['){
push(stack,s[i]);
}else {
if(IsEmpty(stack)) return false;
pop(stack,u);
if(s[i]==')'&&u!='(') return false;
if(s[i]=='}'&&u!='{') return false;
if(s[i]==']'&&u!='[') return false;
}
}
return IsEmpty(stack);//栈为空则合法
}
};
复习数据结构时老师讲了这题,就顺便把栈的定义和基本操作写上了,写得很潦草,初次写,有不妥的地方欢迎指正。