考研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. 小结

相关推荐
Yeats_Liao19 小时前
MindSpore开发之路(八):数据处理之Dataset(上)——构建高效的数据流水线
数据结构·人工智能·python·机器学习·华为
客梦20 小时前
数据结构-线性表
数据结构·笔记
鹿角片ljp21 小时前
力扣226.翻转二叉树-递归
数据结构·算法·leetcode
WBluuue21 小时前
数据结构和算法:Morris遍历
数据结构·c++·算法
客梦21 小时前
数据结构-红黑树
数据结构·笔记
Sheep Shaun1 天前
STL:string和vector
开发语言·数据结构·c++·算法·leetcode
winfield8211 天前
滑动时间窗口,找一段区间中的最大值
数据结构·算法
k***92161 天前
list 迭代器:C++ 容器封装的 “行为统一” 艺术
java·开发语言·数据结构·c++·算法·list
阿恩.7701 天前
材料工程科技期刊征稿:快速发表,知网、维普检索!
经验分享·笔记·考研·网络安全·数学建模·能源·制造
x70x801 天前
C++中auto的使用
开发语言·数据结构·c++·算法·深度优先