【C++数据结构与算法】括号匹配算法

【C++数据结构与算法】括号匹配算法

这是从《c++数据结构与程序设计》这本书改过来的一个算法。
会用到c++内置的数据结构栈。

要解决的问题:输入一行括号,判断这行括号是否匹配

算法原理和代码思路

一句话概括算法原理:逐个读入括号,如果遇到左括号,则入栈,如果遇到右括号,则将栈顶元素与当前右括号进行判断,若匹配则出栈,若不匹配则结束判断。

比如给出这样的一行括号:((({}<>())))

我们可以很容易发现,这行括号是匹配的。

我们可以一个个括号进行出入栈分析,分析如下:

首先是4个左括号的入栈,即((({,栈底是(,栈顶是{;
然后遇到了第一个右括号},将}与栈顶元素进行匹配,我们容易发现,{ 和 } 是匹配的,于是我们弹出栈顶元素{,那么这个栈就变成了(((;
继续读取下一个括号,我们读到了<,入栈,栈变成了(((<,栈顶是<;
继续读取下一个括号,我们读到了>,将>和栈顶元素<进行匹配,我们发现<和>是匹配的,于是将<出栈,这个栈就变成了(((;
继续往下,读到(,入栈;
往下,读到),匹配,出栈;
往下,读到),匹配,出栈;
往下,读到),匹配,出栈;
往下,读到),匹配,出栈;
匹配成功!!

再举一个例子,输入(<>,这个显然不匹配,因为没有多余的)和(匹配。

如果只输入>,那也不匹配,因为栈为空,没有栈顶元素和>进行匹配。

代码如下(思路写在注释里面了):

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack <char> open;//建立一个栈
    char in;
    bool is_matched = true;//是否匹配的bool值
    while(1)
    {
        in = cin.get();//逐个获取输入的括号
        if(in == '\n') break;
        //cout<< "test " << in << endl;
        if( in=='(' || in=='[') //左括号入栈
            open.push(in);//我偷懒了,就只用了[]和()这两对括号
        if( in==')' || in==']'){//右括号,判断是否匹配
            if(open.empty()){//如果栈为空,也就是说没有左括号,那么显然不匹配
                //cout << "不匹配" << endl;
                is_matched = false;
                break; 
            }
            else{
                char temp = open.top();
                open.pop();
                is_matched = ( temp=='(' && in== ')')
                           ||( temp=='[' && in== ']');//是否匹配的bool值
                if(!is_matched){
                    //cout << "不匹配" << endl;
                    break; 
                }
            }
        }
    }
    if(!open.empty())cout << "不匹配" << endl;
    //如果到最后栈不为空,那么就说明还有未能匹配的的左括号,也就是不匹配
    else cout << "成功匹配" << endl; 
 } 

欢迎评论,欢迎交流。

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