栈和队列的典型应用
括号匹配问题
IDE:可视化的一个编程环境
括号匹配的过程
(((())))
观察发现:最后出现的左括号最先被匹配(LIFO)
((())())
总之,每当出现一个右括号,就“消耗”一个左括号;这里的消耗就对应于出栈的过程
当我们遇到左括号就把它压入栈中,当我们遇到右括号的时候,就把栈顶的那个左括号弹出
示例:可以成功匹配时无法成功配对时:
其余两种情况:出现单身的左括号或者右括号
总体流程如下
算法实现如下:
bool bracketCheck(char str[],int length)
{
SqStack S;
InitStack(S);//初始化一个栈
for(int i =-0;i<length;i++)
{
if(str[i]='{'||str[i]='['||str[i]='('){
Push(S,str[i]);//扫描到左括号,入栈
}else{
if(StackEmpty(S))//扫描到右括号,且当前栈的状态为空
return false;//匹配失败
char topElem ;
Pop(S,topElem);//栈顶元素出栈
if(str[i]==')'&&topElem !='(')
return false;
//如果当前的右括号和出栈的左括号不配对时,则返回错误信息。
if(str[i]==']'&&topElem !='[')
return false;
if(str[i]=='}'&&topElem !='{')
return false;
}
}
return StackEmpty(S);
//检索完全部括号后,栈空则表示匹配成功
}
总结
用栈实现括号匹配:
依次扫描所有字符,遇到左括号入栈,遇到右括号则弹出栈顶检查是否匹配。
匹配失败情况:
1、左括号单身
2、右括号单身
3、左右括号不匹配