首页 > 其他分享 >[数据结构笔记] 线性表

[数据结构笔记] 线性表

时间:2023-07-27 17:34:05浏览次数:36  
标签:线性表 int text top 元素 栈顶 笔记 栈底 数据结构

栈是一种后进先出(\(\text {Last In First Out,LIFO}\))的线性表,顾名思义,后入栈的元素反而先出栈,其限制是只能在一端插入与删除,

就像下面这样,只有一端有开口,另一端则是封死的。

\[栈顶 \large\begin{array}{c|c|c|c|c|c|c|c|{3}{r@{.}l|}} \hline \ \text{} 0&1 & 2&3 & 4&5&6&7&...\\ \hline \end{array} 栈底 \]

一般的,我们将栈能插入与删除的一端称为「栈顶」,而不能进行操作的一端称为「栈底」。

同时,插入操作一般称作入栈或压栈(\(\text {push}\)),删除操作称作出栈或弹出(\(\text {pop}\))。

一个通俗的例子是把栈看作一个盘子堆,只能在盘子堆的顶上拿取盘子,如果从中间抽出/插入盘子,盘子堆就会倒塌,碎成碎片。

手写栈

接下来我们尝试一下,使用静态数组来模拟一个栈。

从增加元素开始,先考虑栈底与栈顶的位置,很明显,为了不限制栈的大小与方便,栈底设在 \(1\) 的位置比较好,

再用一个 int \(top\) 指向当前栈顶的位置

int top = 0,s[MAXN] = {0}; // 一开始栈内没有元素,所以 top 指向 0 表示当前栈内为空

当进行压栈时,新的元素会被「放」在原来的栈顶上,

此时的栈顶就是 \(top + 1\),再赋值即可。

void push(int x){ // 传参需要压栈的元素 x
    s[top ++] = x; // 压入元素
}

因为只是操作了一次数组 \(s\) 与 变量 \(top\),所以时间复杂度为 \(O(1)\) 。

接下来是删除元素,可以想到将栈顶移动到原栈顶的下一个元素上,以删除原本的元素。

但是要判断一下当前 \(top\) 是否指向的是 \(0\)(空栈),否则就会收获 \(\color {Purple} {\texttt {RE}} \times \infty\)。

int pop(){
    if(top)top --;
    else return -1;
    return 0;
}

同样的,时间复杂度为 \(O(1)\)。

而还有一个常用操作就是取栈当前的元素个数,因为 \(top\) 指向了栈顶,所以 \(top\) 就是栈当前的元素个数。

int size(){
    return top;
}

\(\text {STL stack}\)

除了可以手写栈,强大的 \(\text {STL}\) 还为我们提供了 stack 关键字,用法如下:

stack<int> s 声明一个 int 类型的栈 \(s\)。

s.push(x) 将元素 \(x\) 压入栈 \(s\)。

s.pop() 弹出栈 \(s\) 的栈顶元素。

s.empty() 返回一个 booltrue 表示栈 \(s\) 为空,false 反之。

s.size() 返回一个 int,表示栈 \(s\) 的元素个数。

更多方法见微软文档 \(\texttt{stack STL}\) 部分。

队列

链表

标签:线性表,int,text,top,元素,栈顶,笔记,栈底,数据结构
From: https://www.cnblogs.com/acangcang-Eliauk/p/17585575.html

相关文章

  • 虚树学习笔记
    观前须知:本博客中\(k\)均指关键点数量-2前置芝士你需要会基本的dfs序(下简称dfn)及性质,并且要会写LCA(推荐树剖因为快)-1典型特征关键点\(\sumk\le1e5\)之类的很小的数虚树的特点是只保存关键点及其LCA0引入例:\(\color{green}CF613D\)这个树上问题可以说非常......
  • Redis数据结构总结
    Redis数据结构  SDS SimpleDynamicString 双向链表 list 字典 dict 整数集合 intset 跳跃表 zskiplist 压缩列表 ziplist ......
  • 【学习笔记】
    在标签中填写onclick事件调用函数时,不是 onclick=函数名,而是 onclick=函数名+(),代码如下所示:<!DOCTYPEhtml><html><head>  <metacharset="utf-8">  <title>*来自菜鸟教程(runoob.com)</title></head><body>  <h1>我的第......
  • MySQL学习笔记
    一、SQLSQL语句通用语法SQL语句可以单行或多行书写,以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。注释:单行注释:--注释内容或#注释内容(MySQL特有)多行注释:/*注释内容*/SQL分类DDL:DataDe......
  • 数据结构练习笔记——求解由单链表表示的一元多项式的值
    求解由单链表表示的一元多项式的值【问题描述】一个形如\[a_0x^0+a_1x^1+...+a_nx^n\]的一元多项式含有n+1项,每一项由系数和指数唯一确定,可表示成由系数项和指数项构成的一个二元组(系数,指数),一元多项式则可以表示成二元组的集合{(a0,0),(a1,1),(a2,2)...(an,n)},可看成是数据......
  • 尚硅谷Java 宋红康2023版 - 学习笔记
    尚硅谷Java宋红康2023版-学习笔记观看地址https://www.bilibili.com/video/BV1PY411e7J6JDKJREJVMjdk是开发包,jre是运行包,jvm是java虚拟机(最小核心)javajdk版本8或11我这里就用8了。......
  • 循迹小车笔记
    循迹基础两路、三路、四路、五路、八路循迹。两路循迹2路红外循迹小车,3种转向方式对比@B站.布丁橘长讲解了三种转向方式:(以左转为例)1、左轮停止,右轮正转2、左轮反转,右轮正转3、左轮反转,右轮停止todoPID寻迹......
  • 算法学习笔记(28): 筛法
    筛法线性筛杜教筛放在偏序关系\((\Z,|)\)中卷积……如何快速的求\(S(n)=\sum_{i=1}^nf(i)\)。如果能够找到一个函数\(g\):\[\begin{aligned}\sum_{i=1}^n(f*g)(i)&=\sum_{i=1}^n\sum_{d|i}f(\fracid)g(d)\\&=\sum_{d=1}^{n}g(d)\sum_{i......
  • 算法学习笔记(27): 后缀排序
    后缀排序本文做复习用,不宜初学用。开篇膜拜Pecco:算法学习笔记(84):后缀数组-知乎(zhihu.com)有些时候,其实\(O(n\log^2n)\)的排序也挺好。又短又简单。其中\(rk[i]\)表示从第\(i\)个字符开始的后缀的排名,\(sa[i]\)表示排名为\(i\)的后缀开始的位置。#includ......
  • 线性表的顺序存储原理及实现
    线性表是一种常见的数据结构,它是由一组相同数据类型的元素按照一定的顺序排列而成的数据集合。线性表可以使用不同的存储方式,其中一种常见的方式是顺序存储。顺序存储方式是将线性表的元素连续地存储在一片连续的内存区域中,通过使用数组实现。每个元素占用一个存储单元,通过数组的......