括号匹配详解

括号匹配详解

今天带来的是括号匹配算法。

 

题目描述

用顺序存储实现栈的初始化、入栈、出栈、取栈顶、判栈空操作。调用以上操作实现判断从键盘输入的括号序列是否匹配。

输入

括号序列

输出

匹配或不匹配

样例输入

{[()]}

样例输出

匹配 

 

 

这是个使用栈解决的典型题目。

对一个给定的括号序列比如:{[()]}{]

首先判断是否是左括号如果是,那么把它保存到栈里面(只让左括号存入),如果不是,就进行我们的判断环节,比如对上面给出的例子,栈里面保存了{,[,(。当遇到)时,开始判断。

那么具体怎么判断呢?

对于一个序列,它其中的括号是否匹配,标志就是右括号总有一个“相邻”的左括号与之对应。

比如{()},很明显是匹配的,因为你看到了),而它的左边刚好是一个 ( ,因此 () 匹配,接下来你就不再看(,相当于 ( 出栈,接着是 } ,由于 ( 已经出栈,与之相邻的就是 { ,因此匹配。

再来看一个例子,{[}] ,入栈的是{ [,右括号是 } ,与它相邻的是 [ ,因此不匹配。接下来的 ] 也就不用判断了

还有一种情况就是不能完全匹配,例如,{[] ,这种情况也需要考虑进去。

具体代码实现如下:

#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;
}

 

posted @
2017-11-15 19:10
Nikki_o3o 阅读(
) 评论(
)
编辑
收藏

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/EliminatedAcmer/article/details/88407573
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞