[知识点] 7.1 栈,队列与链表

Posted jinkun113

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[知识点] 7.1 栈,队列与链表相关的知识,希望对你有一定的参考价值。

前言

马上要考数据结构了,停更一个星期后决定先把数据结构这一块复习一遍。

(总目录:https://www.cnblogs.com/jinkun113/p/12528423.html

子目录列表

1、数据结构简介

2、栈

3、队列

4、链表

 

7.1 栈,队列与链表

1、数据结构简介

数据结构,顾名思义,计算机存储数据的结构。最简单的,变量,数组,都是数据结构。一般情况下对于数据结构的学习中,这些就直接略过而归入语言基础了,而数据结构专题往往从栈,队列与链表这三大基本结构开始介绍。

程序的运行离不开数据结构,而不通的数据结构各有优劣,对于不同的问题,选取合适的数据结构能够大幅提升算法的效率。

 

2、栈

① 概念

栈(stack)是最常见的线性数据结构之一,并且栈这个概念在计算机中经常被提及——汇编语言里有堆栈操作程序,平常编程时会提到栈溢出……

那么栈到底是什么?从中文里似乎不能直接想到,那么从英文入手——stack,其本义为堆叠(n. & v.),想象一下,新学期开学了,学校下发了 3 本新教材,你想把它们整理好并堆成一叠放在寝室——先把数据结构放在桌上,再把汇编语言放在数据结构上面,再把计算机组成放在汇编语言上面,叠好了。这个过程是从下到上堆叠的。而现在开始上数据结构课了,如果你需要从里面取出教材,在不考虑直接从下面抽取的情况,则必须要从最上方的计算机组成开始取,然后再拿出汇编语言,最后才能拿到数据结构。

技术图片

这种结构的最大特点是——后加入的数据必须最先取出,简称为后进先出(LIFO, last in first out)。

我们将栈的最上方称为栈顶,最下方称为栈底,即每次加入数据都只能从栈顶加入。

汉诺塔问题也是个比较典型的栈——每次在堆叠的时候,我们必须将最上方那块最小的先移动到其他位置,才能移动下方的,以此类推——而上次介绍汉诺塔问题是在递归部分(请参见:https://www.cnblogs.com/jinkun113/p/12797469.html)。

说到递归,我们发现它似乎和栈有异曲同工之妙——递归过程不也是对于最后进入的层必须最先处理吗?没错,递归其实本质也是栈结构,这就是为什么在介绍 DFS 的时候提到,实现 DFS 是通过栈这个数据结构实现的(https://www.cnblogs.com/jinkun113/p/12885905.html)。

汇编语言里提到的堆栈操作程序同理,将寄存器中的数据 PUSH 进去,最先 POP 出来的则是最后 PUSH 进去的。

 

② 常用操作

那么对于这样一个数据结构,可以进行哪些操作?我们还是模拟一下取书的过程:

> 首先肯定可以把书放入;

> 然后可以看到最上方的书是什么(下方的书不能看到);

> 然后可以取出最上方的书;

> 可以对书本数量进行计数;

> 可以判断是否还有书。

那么这五个过程,可以分别对应栈的五种操作:

> push:将元素加入栈顶;

> top:获取栈顶元素;

> pop:将栈顶元素取出;

> size:获取栈内元素个数;

> empty:判断栈是否为空。

 

③ 代码实现

先给出一段手搓的栈的实现代码。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 #define MAXN 1005
 5 
 6 class Stack {
 7     int stk[MAXN], tot;
 8 public:
 9     Stack() : tot(0) {}
10     void push(int o) {
11         tot++, stk[tot] = o;
12     }
13     int top() {
14         return stk[tot];
15     }
16     void pop() {
17         tot--;
18     }
19     int size() {
20         return tot;
21     }
22     bool empty() {
23         return tot;
24     }
25 };
26 
27 int main() {
28     Stack s;
29     s.push(1), s.push(2), s.push(3);
30     cout << s.size() <<   << s.top() << endl;
31     s.pop(), s.pop();
32     cout << s.size() <<   << s.top() << endl;
33     s.pop();
34     cout << s.empty();
35     return 0;    
36 }

五个操作应该都不用过多解释。

如果使用的是 C++,那么学过 STL(请参见:https://www.cnblogs.com/jinkun113/p/10367638.html)应该就知道,可以使用 STL 容器来实现栈。

④ 应用举例

以上是关于[知识点] 7.1 栈,队列与链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法——栈和队列

数据结构——栈(线性表与链表)

顺序栈与链表栈的实现

队列的实现与简单应用

Python数据结构系列❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现

C语言中链表与队列有很么区别?