栈的应用——括号匹配(C++)
假设在表达式中包含三种括号:圆括号 ‘ ( ' 和 ' ) ' ; 方括号 ' [ ' 和 ' ] ' ;花括号 ' { ' 和 ' } ' 。考虑下列序列:
{ | [ | ( | ) | ] | } |
---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 |
上面括号表达式中,第1个进栈的括号 “{” 期望与第6个括号 “}” 进行匹配,而第2个括号 “[” 进栈后,此时会将第一个括号 “ { ” 暂放一边,而期望与第5个括号 “ ] ” 进行匹配,同理第3个括号 “ ( ” 入栈后又将前两个暂时放一边而期待与第4个括号 “ ) ” 匹配。
算法思想:
初始化一个堆栈
stack
,开始依次扫描括号字符串string
,当遇到( ’ { ’ 、’ [ ’ 、 ’ ( ’ )左括号时将其压入栈中, 当遇到右括号时将检查栈顶元素是否为与此右括号对应的左括号,若对应,则将其对应左括号出栈,若不对应,则表达式有误,返回false
。在过程中只有左括号才会压入栈内,当表达式正确时,最后栈将一次次左括号出栈而变为空栈。扫描完所有字符后,检查堆栈是否为空栈,若是,返回true
,否则返回false
。
程序如下:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
bool BracketCheck(string str) {
stack<string::value_type> st; // 声明一个空栈
int i = 0;
while (str[i] != '\0') // C++11 中string字符串也是以'\0'结尾的
{
switch (str[i]) {
// 左括号入栈
case '(': st.push('('); break;
case '[': st.push('['); break;
case '{': st.push('{'); break;
// 遇到右括号
case ')':
if (st.top() != '(') // 栈顶元素不是'(', 则不匹配
return false;
st.pop(); // 栈顶元素为'(', 弹出'('
break;
case ']':
if (st.top() != '[') // 栈顶元素不是'[', 则不匹配
return false;
st.pop(); // 栈顶元素为'[', 弹出'['
break;
case '}':
if (st.top() != '{') // 栈顶元素不是'{', 则不匹配
return false;
st.pop(); // 栈顶元素为'{', 弹出'{'
break;
default:
break;
}
i++;
}
// 堆栈为空表明压入栈的所有左括号都成功匹配,则返回true,否则返回false
if (st.empty())
return true;
else
return false;
}
int main()
{
string str{ "{[()]}" };
if (BracketCheck(str)) // 返回值为true
cout << "匹配成功" << endl;
else // 返回值为false
cout << "匹配失败" << endl;
return 0;
}
运行结果:
匹配成功