[知识点] 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 栈,队列与链表的主要内容,如果未能解决你的问题,请参考以下文章