括号匹配详解
今天带来的是括号匹配算法。
题目描述
用顺序存储实现栈的初始化、入栈、出栈、取栈顶、判栈空操作。调用以上操作实现判断从键盘输入的括号序列是否匹配。
输入
括号序列
输出
匹配或不匹配
样例输入
{[()]}
样例输出
匹配
这是个使用栈解决的典型题目。
对一个给定的括号序列比如:{[()]}{]
首先判断是否是左括号如果是,那么把它保存到栈里面(只让左括号存入),如果不是,就进行我们的判断环节,比如对上面给出的例子,栈里面保存了{,[,(。当遇到)时,开始判断。
那么具体怎么判断呢?
对于一个序列,它其中的括号是否匹配,标志就是右括号总有一个“相邻”的左括号与之对应。
比如{()},很明显是匹配的,因为你看到了),而它的左边刚好是一个 ( ,因此 () 匹配,接下来你就不再看(,相当于 ( 出栈,接着是 } ,由于 ( 已经出栈,与之相邻的就是 { ,因此匹配。
再来看一个例子,{[}] ,入栈的是{ [,右括号是 } ,与它相邻的是 [ ,因此不匹配。接下来的 ] 也就不用判断了
还有一种情况就是不能完全匹配,例如,{[] ,这种情况也需要考虑进去。
具体代码实现如下:
#include <iostream> #include <cstring> #include <stack> using namespace std; bool isbalance(const string& str) { int len =str.size(); stack<char> mystack; for(int i=0; i<len; ++i) { if(str[i]=='['||str[i]=='{'||str[i]=='('||str[i]=='<') mystack.push(str[i]); if(str[i]==']'||str[i]=='}'||str[i]==')'||str[i]=='>') { if(mystack.empty()) { return false; } switch(str[i]) { case ']': { if('['!=mystack.top()) return false; mystack.pop(); break; } case '}': { if('{'!=mystack.top()) return false; mystack.pop(); break; } case ')': { if('('!=mystack.top()) return false; mystack.pop(); break; } case '>': { if('<'!=mystack.top()) return false; mystack.pop(); break; } } } } if(mystack.empty()) return true; else { mystack.pop(); return false; } } int main() { bool balance; string str; cin>>str; balance=isbalance(str); if(balance) cout<<"匹配"<<endl; else cout<<"不匹配"<<endl; return 0; }