首页 > 编程语言 >数据结构(二):括号匹配(C++,栈)

数据结构(二):括号匹配(C++,栈)

时间:2022-11-23 20:45:18浏览次数:52  
标签:匹配 sta 元素 栈顶 C++ 括号 堆栈 数据结构

好家伙,写题,题目代码在最后

 

来吧,

 

 

1.栈 

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。

这一端被称为栈顶,相对地,把另一端称为栈底。

向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;

从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。                                                                                                                                                                                                                                                                                 ——百度百科  

上图

 

 

 总之,我们记住这玩意"先进后出"就行了

举个栗子,(假设水倒入杯子后不会流动)

就像你烧了一壶水,拿个杯子倒水,然后喝了一口

你喝的第一口水是你最后倒进去的

而你最先倒进去的水在最下面

 

最后倒进去的水最先喝到

最先倒进去的最后喝到

这就是先进后出了

(是不是拿固体举例子会比较好...)

 

 

方法以及标识:

//头文件
#include <stack>

//实例化字符类型的栈
stack <char> sta;

常用方法:

1.1.sta.top()方法

函数用于访问栈顶元素

 

1.2.sta.pop()

函数用于移除栈顶元素

 

1.3.sta.size()

函数返回堆栈元素的数量。堆栈元素的数量是指堆栈的大小。

堆栈元素的大小是非常重要的信息,因为基于它我们可以推断出许多其他内容,例如所需的空间等。

 

1.4.sta.push(new_obj)

函数用于在栈顶添加新元素

 

1.5.sta.empty()

函数用于测试容器是否为空

 

 

 

 

2.题目如下:

输入一串字符串,该字符串只能由各种不同的括号组成,设计算法,测试该字符串中的括号是否匹配。

如:“({[]})”该字符串中括号是匹配的,字符串“[{{}(”是不匹配的,要求采用栈的思想来完成该题目

 

 

 

2.1.分析一波题目:

我们用栈去解决这个题目(不然为什么会有上面的内容)

这种对称的题目用栈来做就是很舒服

利用栈的先进后出的特点,我们可以进行左右括号的匹配,“(){}”,在右括号“)}”左边最近的左括号必须是相对应的“({”,否则就不合法
先把左半边的括号全部入栈,然后按入栈的反顺序依次去查对应右括号,(如先入"{("那么就先查")}")

若果出现不匹配,则返回false,

每次匹配一对正确的括号,就要将其出栈,为后面的括号腾出空间。

 

上代码:

#include <iostream>
#include <stack>

using namespace std;

    bool isValid(string s) {
        stack <char> sta;
        char c,b;
        int l=s.length();
       for(int i=0;i<l;i++)
              {
                //将所有的左半边括号入栈 
                  if(s[i]=='(' || s[i]=='[' || s[i]=='{')
                        {
                            sta.push(s[i]);
                        }
                        //对后面的元素逐一检查
                        //三种情况
                        //1.栈空了,返回false 
                        //2.成功匹配,将成功匹配的字符出栈 
                        //3.其他情况,返回false 
                        else if(s[i]==')')
                        {
                            if(sta.empty())
                                return false;
                            else if(c=sta.top(),c=='(')
                                    sta.pop();
                            else
                                return false;
                        }
                        else if(s[i]==']')
                        {
                              if(sta.empty())
                                return false;
                            else if(c=sta.top(),c=='[')
                                    sta.pop();
                            else
                                return false;
                        }
                        else if(s[i]=='}')
                        {
                              if(sta.empty())
                                return false;
                            else if(c=sta.top(),c=='{')
                                    sta.pop();
                            else
                                return false;
                        }
              }
              if(sta.empty())
                return true;
              else
                return false;
    }
    
int main()
{
   string s;
   cin>>s; 
   //输入字符 
   bool b=true;

   b=isValid(s);
   if(b==true)
   cout << "true";
   else cout << "false";
    return 0;
}

 

 

输入样例:

输入: ({}(000))

输出: true

 

 

 

标签:匹配,sta,元素,栈顶,C++,括号,堆栈,数据结构
From: https://www.cnblogs.com/FatTiger4399/p/16919612.html

相关文章

  • C++ 嵌入式实时操作系统调试心得
    1、如果设置了全局vector变量,然后在程序中一直pushback,如果是系统内存较小,运行一段时间后可能会崩溃;2、如果使用C语言编程采用动态内存,一定要在变量生存周期结束时对内存......
  • C++ --- 标准库std::max/std::min和window头文件中宏max/min冲突
    转载:https://blog.twofei.com/668/在包含了Windows.h的C++源代码中使用std::min/std::max会出现错误。intmain(){intx=std::max(0,1);inty=std......
  • Mybaties模糊查询包含括号(), #{} 单引号失效问题
    比如我想模糊查询一个字符,是"platformConfig":"Amazon(Auto)"再过去我的的Myabties文件是这样写的<iftest="platformConfig!=nullandplatformConfig!=''">......
  • 数据结构与算法测试题
    1.完全二叉树的第5层有9个节点,该完全二叉树总计有多少个节点( B   ).A.41B.24C.40D.25完全二叉树,说明前四层都是满结点,第五层有九个结点,故有:2^4 -1=15     ......
  • 数据结构习题整理(4.0)
    42.试着写出一个判定给定二叉树是否为二叉排序树的算法。设此二叉树以二叉链表作存储结构,且树中结点的关键字均不同。intisbstree(bitreet)/*判断是否为二叉排序树*/{if(t......
  • C++ 判断闰年简单代码
    闰年闰年分为普通闰年和世纪闰年1582年以来的置闰规则:普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。世纪闰年:公历年份是整百数的......
  • 周六900C++班级-2022-11-19 01背包
    背包问题关系图  问题描述若有N件物品和一个最多能装重量为W的背包,一个物品只有两个属性:重量和价值。第i件物品的重量是weight[i],得到的价值是value[i]。假......
  • 用汇编的眼光看C++(之 总结篇)
       早在八月份的时候,就陆陆续续写了二十多篇用汇编语言看C++的博客内容。在此为了做一个概括,也为了朋友们看起来更方便,我们利用这么一篇博客对所有的文章做一个总结。如......
  • socket通信编程C++实现
    socket提供了套接字,以方便我们想读取文件一样进行网络进程间的数据通信。在网络通信中,套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文......
  • 数据结构初阶--顺序表(讲解+C++类模板实现)
    顺序的概念与结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。一般分为两种:静态顺序表和动......