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

数据结构,括号,匹配,c++ · 浏览次数 : 566

小编点评

```c++ #include #include using namespace std; bool isValid(string s) { stack 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; } ```

正文

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

 

来吧,

 

 

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

 

 

 

与数据结构(二):括号匹配(C++,栈)相似的内容:

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

好家伙,写题,题目代码在最后 来吧, 1.栈 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。 这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素; 从一个栈删除元素

京东云开发者| Redis数据结构(二)-List、Hash、Set及Sorted Set的结构实现

1 引言 之前介绍了Redis的数据存储及String类型的实现,接下来再来看下List、Hash、Set及Sorted Set的数据结构的实现。 2 List List类型通常被用作异步消息队列、文章列表查询等;存储有序可重复数据或做为简单的消息推送机制时,可以使用Redis的List类型。对于这

iceoryx源码阅读(四)——共享内存通信(二)

目录1 队列数据结构2 共享内存获取2.1 PublisherImpl::loan2.2 PublisherImpl::loanSample2.3 PublisherPortUser::tryAllocateChunk2.4 ChunkSender::tryAllocate3 消息发送逻辑3.1 P

Redis 常用的数据结构简介与实例测试【Redis 系列二】

〇、都有哪些数据结构? Redis 提供了较为丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。 随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版

(二)Redis 数据类型与结构

1、值的数据类型 Redis “快”取决于两方面,一方面,它是内存数据库,另一方面,则是高效的数据结构。Redis 键值对中值的数据类型,也就是数据的保存形式有5种:String(字符串)、List(列表)、Hash(哈希)、Set(集合)和 Sorted Set(有序集合)。这5种数据类型由6种底

数据结构与算法大作业:走迷宫程序(实验报告)

好家伙,本篇为应付老师的实验报告,有需要的拿去抄吧 思路讲解在上一篇: 数据结构与算法大作业:走迷宫程序(C,代码以及思路) 一、作业目的 1、 掌握用数据结构的知识进行程序设计。 2、 应用所学的数据结构完成一个具有一定实际意义的应用程序的设计、编码、调试,锻炼实践动手能力,提高编程水平。 二、作

第一百一十三篇: JS数组Array(二)数组方法 栈、队列、排序

好家伙, 在上一篇中,我们知道了, JS的数组中每个槽位可以存储任意类型的数据 那么,我们能通过数组去模仿某些数据结构吗? 答案是肯定的 1.栈方法 ECMAScript 给数组提供几个方法,让它看起来像是另外一种数据结构。 数组对象可以像栈一样,也就是一种限制插人和删除项的数据结构。 栈是一种后进

#Powerbi 1分钟学会,RANK函数,多字段排名函数.

一:思维导图&数据源示例 1.1思维导图 1.2示例数据源 二:参数构成 三:案例度量值 基础度量值 总销量 = CALCULATE(SUM('数据源'[销量])) 总销售额 = CALCULATE(SUM('数据源'[销售额])) RANK度量值 RANK排名 = RANK( MAKE BY SI

[转帖]人大金仓数据库的备份与还原

人大金仓数据库的备份与还原 文章目录 人大金仓数据库的备份与还原前言备份sys_dump 命令 还原ksql 命令sys_restore 一. 从人大金仓数据库备份还原到人大金仓数据库二 从postgresql数据库备份还原到人大金仓数据库 后记 前言 本文记录一次使用人大金仓数据库(Kingbas

架构设计(二):数据库复制

架构设计(二):数据库复制 作者:Grey 原文地址: 博客园:架构设计(二):数据库复制 CSDN:架构设计(二):数据库复制 在架构设计(一):从单服务器模式到负载均衡设计中提到了数据库类型的选择, 针对大数据量,高可用的场景,数据库复制是一种比较好的方式,其中多个数据库实例之间可以是主/从关系