括号匹配详解
来源:互联网 发布:mac用什么flash player 编辑:程序博客网 时间:2024/06/07 01:37
今天带来的是括号匹配算法。
题目描述
输入
输出
样例输入
样例输出
这是个使用栈解决的典型题目。
对一个给定的括号序列比如:{[()]}{]
首先判断是否是左括号如果是,那么把它保存到栈里面(只让左括号存入),如果不是,就进行我们的判断环节,比如对上面给出的例子,栈里面保存了{,[,(。当遇到)时,开始判断。
那么具体怎么判断呢?
对于一个序列,它其中的括号是否匹配,标志就是右括号总有一个“相邻”的左括号与之对应。
比如{()},很明显是匹配的,因为你看到了),而它的左边刚好是一个 ( ,因此 () 匹配,接下来你就不再看(,相当于 ( 出栈,接着是 } ,由于 ( 已经出栈,与之相邻的就是 { ,因此匹配。
再来看一个例子,{[}] ,入栈的是{ [,右括号是 } ,与它相邻的是 [ ,因此不匹配。接下来的 ] 也就不用判断了
还有一种情况就是不能完全匹配,例如,{[] ,这种情况也需要考虑进去。
具体代码实现如下:
#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;
}
- 括号匹配详解
- 括号括号括号匹配
- 详解括号匹配问题(STL stack)
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配/()[]
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配!!!!
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- 括号匹配
- IO流(二)
- 交通工具
- JVM
- 例题8-3 和为0的4个值(4 Values Whose Sum is Zero, ACM/ICPC SWERC 2005, UVa 1152)
- 图结构练习——最短路径(dijkstra算法)
- 括号匹配详解
- 三目运算符?:
- 日期和时间
- 十月十三日课堂笔记
- VS2013 调试窗口一闪而过的解决方法
- 链表(用一个结构体管理另一个结构体的头指针),方便管理好几个链表的情况。
- CCF 通信网络
- TypeError: Input 'split_dim' of 'Split' Op has type float32 that does not match expected type of int
- 简单vim命令