zoukankan      html  css  js  c++  java
  • 括号匹配详解

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

    题目描述

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

    输入

    括号序列

    输出

    匹配或不匹配

    样例输入

    {[()]}

    样例输出

    匹配 

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

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

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

    那么具体怎么判断呢?

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

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

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

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

    具体代码实现如下:

    #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;
    }
  • 相关阅读:
    sqlserver查询当前库下,一张表的表名,字段名,字段类型,字段长度
    JAVA将汉字转换为全拼以及返回中文的首字母,将字符串转移为ASCII码
    Springmvc 简单入门1
    第一篇,java学习之旅
    基于html5,父级块中添加video,不能全屏播放的问题解决。
    windows10 jdk8下载与安装
    R 安装 Bioconductor 的网络连接问题
    R 内存管理问题
    MCMC sampling 【转】
    最大似然估计(Maximum likelihood estimation)【转】
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9450775.html
Copyright © 2011-2022 走看看