首页 > 其他分享 >数据结构第一节:栈

数据结构第一节:栈

时间:2022-12-20 22:55:17浏览次数:51  
标签:include ok int top 第一节 else str 数据结构

序:在经历了Acwing的“从入门到入土”,终于于今天进入了代码源的学习(心疼我好几百报的课阿T_T)。据y总言——”STL是提高C++编写效率的一个利器。“因此,为了提高我们编写代码的效率,咱今天就来学习——数据结构第一节:栈。


“求木之长者,必先固其根本;欲流之远者,必先浚其泉源。”因此,要想学好stl,首先我们要搞明白它的底层逻辑。而今天学习的栈,我们便可以用数组的形式实现。下面是几个例子:


例题1
代码源-101

img

#include <iostream>
 
using namespace std;
 
int top = 0;
char a[1000010];
int s[1000010];
 
int main()
{
    int m;
    scanf ("%d", &m);
 
    for ( int i = 1; i <= m; i++ ){
        scanf("%s" ,a);
 
        if( a[1] == 'u' ) {
            int x;
            scanf("%d" , &x);
            s[++top] = x;
        }else if ( a[0] == 'p' ) {
            --top;
        }else{
            printf("%d\n", s[top]);
        }
    }
 
    return 0;
}

例题2
代码源-104

#include <bits/stdc++.h>
 
using namespace std;
 
int n,top;
char s[100001];
char str[100001];
 
int main()
{
 
    scanf("%d" , &n);
    scanf("%s" ,str);
 
    top = 0;
    bool ok = true;
 
    for ( int i = 0; i < n && ok; i++ )
 
        //先将所有左括号放入栈中
        if ( str[i] == '(' || str[i] == '[' ) s[++top] = str[i];
 
        else if ( !top ) ok = false;  // “ if ( !x )” 等价于 “ if ( x == 0 )”
 
        else if( str[i] == ')' ) {    // 如果新读入的右括号可以和左括号匹配,则删除栈顶左括号
            if (s[top] == '(') --top;
            else ok = false;
        }
 
        else{
            if ( s[top] == '[' ) --top;
            else ok = false;
        }
                        
    if ( top )
        ok = false;   //如果栈没有被清空,也就是说还有未匹配的左括号存在,不合法 
 
    if ( ok )
        printf("Yes\n");
    else
        printf("No\n");
 
    return 0;
}

例三
代码源-106

img


#include <iostream>
 
using namespace std;
 
int n,top = 0;
char s[100010];
char str[100010];
 
int main()
{
 
    scanf("%d%s", &n, s);
 
    for ( int i = 0; i < n; i++ ) {
 
        if (  (int) s[i] == str[top] - 32 || (int) s[i] == str[top] + 32) {
            top--;
        }
            else {
                str[++top] = (int)s[i];
             }
        }
 
    for ( int i = 1; i <= top ; i++ ) printf("%c", str[i]);
 
    return 0;
}

个人理解:依据上述例题,我们可以看出,栈可以简易的理解成构造了一个自下而上的数组可以继续向上拓展的数组,对于这个数组,每次可以向上存储一个数据,且储存的数据,可以从顶部弹出。


对应的stl函数,则存放在头文件 #include 中;

​ 他们可以很便捷的帮我们实现一些功能,

​ 比如上述用到的几个函数:

#include <stack>
using namespace std;
int main()
{
    int x;
    stack<int> s;
    s.push(x); //在栈s顶插入x;
    s.pop();   //删除栈顶元素;
    s.top();   //返回栈顶元素;
}

另外,该头文件中还有其他一些方便的函数,如:

 s.empty(); //查询栈s是否为空  ps:返回值是布尔值
    s.size();  //查询栈中含有元素个数

利用这些函数,我们可以简化我们的代码:

如例一可以进行如下改写;

#include <bits/stdc++.h>
#include <stack> //栈
using namespace std;

stack<int> s;
int m;
char a[100010];

int main()
{
    scanf("%d", &m);

    for ( int i = 0 ; i < m; i++ ){

        scanf("%s", a);

        if ( a[1] == 'u' ) {
            int x;
            scanf("%d" ,&x);
            s.push(x);
        }else if ( a[0] == 'p' ) {
            s.pop();
        }else{
            printf("%d\n", s.top() );
        }

    }

    return 0;
}

然而,这些函数在便捷的为我们服务的同时,也暴露出他们的些许局限性,

假如说我们想要访问栈中自栈顶而下的第k个元素,只是单单得使用stl函数就无法实现这个功能。

而如果理解其底层逻辑——用数组进行求解,则可以通过s[top + 1 - k]来求解。


总结:stl函数可以极大的便利我们的编码过程,但身为初学者,还是很有必要了解其底层逻辑,以解决一些意料之外的问题。

标签:include,ok,int,top,第一节,else,str,数据结构
From: https://www.cnblogs.com/XTian258/p/16995296.html

相关文章

  • 数据结构-二叉树遍历非递归
    前序遍历voidpreorder(BTNODEBT){BTNODESTACK[100];inttop=-1;STACK[++top]=BT;BTNODEp=null;while(top!=-1){BTNO......
  • 数据结构(起泡排序)
    #include<stdio.h>#defineKEYTYPEint#defineMAXSIZE100typedefstruct{KEYTYPEkey;}SSELEMENT;intCOMPARE(SSELEMENTa[],intn){inti,j,p,flag;i=n......
  • 数据结构堆(Heap)&排序
    在我们描述堆之前,我们首先要明白一个概念,什么是树?树的概念及结构1.树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是......
  • 数据结构 玩转数据结构 7-4 Leetcode中的集合问题和更多集合相关问题
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13706 1重点关注1.1见代码演练3.1 1.2有序集合和无序集合7-1二叉树实......
  • 数据结构
    dataframe:二维数据,整个表格,多行多列 series:一维数据,一行或一列s.loc[:,"列名"]=s["列名"].str.replace("'°C","").astype('int32')#去掉°c以excel成绩为例:i......
  • MySQL索引背后的数据结构及算法原理
    摘要:看到的一篇关于MySql索引的介绍,感觉比较经典,直接转了。 摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸......
  • 【数据结构-栈】卡特兰数
    目录卡特兰数公式出栈序列数二叉树形态数卡特兰数公式f(n)=C(2n,n)/(n+1)计算用途:二叉树形态数,出栈序列数出栈序列数【例1】3个不同元素依次进栈,能得到多少种......
  • 常用数据结构:单向链表和双向链表的实现
    1、链表是什么?链表是编程语言中常见的一种数据结构,它可以实现动态的创建和删除,只要内存足够,链表的数量和长度是可以无限多和无限长的。链表顾名思义是一种链式的数据结构,它......
  • 数据结构与算法概念
    目录引入概念第一次尝试算法的提出算法的概念算法的五大特性第二次尝试算法效率衡量执行时间反应算法效率单靠时间值绝对可信吗?时间复杂度与“大O记法”如何理解“大O记法......
  • 数据结构(6):串(下)
    上一回,我们看到串的定义和基本操作,这一会,我们看到串的一个典型应用——模式匹配!简单的模式匹配算法子串的定位操作通常称为串的模式匹配,它求的是子串(常称模式串)在主串中的位......