考研408--数据结构--day4--栈&队列

(以下内容全部来自上述课程)

目录

    • [1. 栈的定义](#1. 栈的定义)
    • [2. 基本操作](#2. 基本操作)
    • [3. 小结](#3. 小结)
  • 顺序栈
    • [1. 定义](#1. 定义)
    • [2. 基本操作](#2. 基本操作)
      • [2.1 初始化](#2.1 初始化)
      • [2.2 进栈操作](#2.2 进栈操作)
      • [2.3 出栈操作](#2.3 出栈操作)
      • [2.4 读栈顶元素操作](#2.4 读栈顶元素操作)
    • [3. 另一种方式](#3. 另一种方式)
    • [4. 共享栈](#4. 共享栈)
    • [5. 小结](#5. 小结)
  • 链栈
  • 队列
    • [1. 定义](#1. 定义)
    • [2. 基本操作](#2. 基本操作)
    • [3. 小结](#3. 小结)
  • 队列的基本操作
    • [1. 顺序实现](#1. 顺序实现)
      • [1.1 初始化操作](#1.1 初始化操作)
      • [1.2 入队操作](#1.2 入队操作)
      • [1.3 循环队列](#1.3 循环队列)
    • [2. 判断满空](#2. 判断满空)
    • [3. 其他出题方法](#3. 其他出题方法)
    • [4. 小结](#4. 小结)
    • [5. 链式实现](#5. 链式实现)
      • [5.1 初始化](#5.1 初始化)
      • [5.2 入队](#5.2 入队)
      • [5.3 出队](#5.3 出队)
      • [5.4 队列满的条件](#5.4 队列满的条件)
    • [6. 小结](#6. 小结)
  • 双端队列
    • [1. 定义](#1. 定义)
    • [2. 考点](#2. 考点)
    • [3. 小结](#3. 小结)

1. 栈的定义

类似于叠石头 ,只能往上叠,而不是塞到下面。


复习:

2. 基本操作


3. 小结

顺序栈

1. 定义

标志 :栈顶指针

2. 基本操作

2.1 初始化

定义结构体-->初始化-->测试使用

因为初始化的时候栈是空的,所以栈顶指针会指向-1,反过来,top=-1就代表了栈空。

2.2 进栈操作

指针指向下一位-->存数据(赋值)
注意 :++在前面,就是先+1再操作;++在后面,就是先操作之后再+1

2.3 出栈操作

先把元素搞出去-->指针指回上一位

ps:逻辑上删除数据是因为指针向下移动了,之前指的数据就不算在栈内了,就是干脆无视它了,但是会残留在内存中。

2.4 读栈顶元素操作

数据慢慢存进去,top一直指向栈顶元素,所以直接按照top的索引得到数据即可。

3. 另一种方式

之前的操作是建立在-----初始化中:栈顶指针指向-1,还没有分配空间的位置。

而接下来的操作是建立在-----初始化中:栈顶指针指向0,分配了空间但是没有存入数据的位置。

由此,索引判断栈空的条件就是top=0.

入栈:先赋值,再移动指针。

出栈:先出栈,再移动指针。

4. 共享栈

之前的栈因为一个地方只能存一个栈的数据,这个栈内的数据可能不总被用到,就导致利用率低。

所以可以将一个栈的空间分给两个栈,这两个栈存各自的数据,栈顶指针就指向各自的栈顶,来提高利用率。

5. 小结

链栈

类比带有限制的链表,这里不再赘述。




队列

1. 定义

类比排队买饭。


2. 基本操作

3. 小结

队列的基本操作

1. 顺序实现

标志:有头指针和尾指针。

1.1 初始化操作

定义结构体-->初始化(头指针尾指针刚开始指向同一个位置)-->测试使用

1.2 入队操作

头指针不动,加入元素,尾指针向后移动。

如图,头指针上面的数据都出队了下面又有数据入队,尾指针需要跳回头指针的下面,也就是队尾,就形成了循环队列(循环队列第一张图)。

这样的操作可以用取余的算法实现。

1.3 循环队列

因为初始化的时候,头指针和尾指针同时指向0,所以如果判断队列满了还是用这个方法就会造成错误。

这里就只能牺牲一个存储单元,避免和初始化的空队列的条件重复。


2. 判断满空

牺牲一个存储单元。

定义size,size满了,就是队列空了。

定义一个tag,插入成功就是0,头尾指针都指向同一个位置并且插入成功的tag=1,就表示队列满了。

3. 其他出题方法

左侧是尾指针指向即将存入数据的空间,也就是尾数据的下一个空间。

右侧是我们上面讲的,尾指针指向尾数据。

所以操作上会有一点点的不同,做题的时候应该注意头尾指针到底指向哪里。


4. 小结

5. 链式实现

定义结点,定义队列。

5.1 初始化

带头结点,头尾指针就都指向头结点。

不带头结点,头尾指针就都指向NULL了。

5.2 入队

  • malloc:分配空间
  • s->data=x;:通过指针s访问新节点的data成员(数据域)是x
  • s->next=NULL;:通过指针s访问新节点的next成员(指针域)是NULL
  • Q.rear->next=s;:问当前队尾节点的next指针域,是s
  • Q.rear=s;:更新队列Q的队尾指针rear,让它指向新节点s(因为s现在是队列的最后一个节点了)

带头结点:

头指针指着头结点,尾指针指向新插入的数据。

不带头结点:

头尾节点都指向新插入的数据。

5.3 出队


5.4 队列满的条件

6. 小结

双端队列

1. 定义


2. 考点




3. 小结

相关推荐
闪电悠米7 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
WL学习笔记8 小时前
堆(数据结构)
数据结构·
A.零点11 小时前
【期末复习,408 考研计组全程笔记 】— 第4章 :指令系统
笔记·考研·408·计算机组成原理
wabs66611 小时前
关于图论【卡码网100.最大岛屿的面积的思考】
数据结构·算法·图论
yuannl1013 小时前
图的最短路径Dijkstra
数据结构
mifengxing14 小时前
计算机组成原理概述
笔记·考研·计算机组成原理·复习笔记
zander25814 小时前
138. 随机链表的复制
数据结构·算法·链表
过期动态14 小时前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
来一碗刘肉面15 小时前
栈在递归中的应用
数据结构·算法
皓月斯语15 小时前
程序设计语言的特点
开发语言·数据结构·c++