前言
前言:研究一个数据结构的时候,首先讲的是增删改查。
文章目录
- 前言
- 一、简介
- 1. 结构
- 2. 特点
- 3. 存储
- 二、栈
- 1. 类比举例
- 2. 操作
- 3. 实现
- 1)顺序栈(常用)
- a. 核心
- b. 要素
- c. 入栈
- d. 出栈
- 2)链式栈
- 三、队列
- 1. 类比举例
- 2. 操作
一、简介
1. 结构
栈和队列都属于数据结构中的线性结构,有前驱和后继的概念。
2. 特点
栈是后进先出。
队列是先进先出。
3. 存储
任何数据结构都是用来存放数据的,不同的数据结构对数据的存取有着不同的要求。
只要涉及到存储数据,一般都是设计数据结构。
数据结构的设计,底层都是基于数组或链表。
二、栈
1. 类比举例
栈可以类比生活中的放/取盘子的过程。
放盘子的过程:先洗完的盘子放在最下面,然后其他的盘子依次往上放,最后洗完的那个盘子一定是放在最上面。
取盘子的过程:取的时候是从上往下依次拿取。
对于放盘子相当于存数据即入栈操作,取盘子相当于取数据即出栈操作。
2. 操作
栈只能在一端进行存数据,另一端是封闭的。
存数据的一端叫做栈顶,存放数据的过程叫做入栈,封闭的一端叫做栈底。
进行数据操作的时候,只有栈顶元素是对外可见的,其他元素对外是不可见的,故只能操作栈顶的数据。
3. 实现
所有的数据结构都可以通过组和链表来实现。
通过数组实现的栈叫顺序栈,链表实现的栈叫链式栈。
1)顺序栈(常用)
a. 核心
按照栈的要求,在数组中存取数据。
b. 要素
创建一个数组。
栈顶指针(top
),实时指向栈顶元素。当 top=-1
,表示空栈。
c. 入栈
元素 x
入栈,a[++ top] = x
,如下图所示。
// 入栈代码
void push(int element){
//首先需要判断栈是否已满
if(top == size-1) {
throw new StackOverflowError();
}
else {
a[++top] = element;
}
}
d. 出栈
元素 2
出栈,top --
,如下图所示。
// 出栈代码
int pop(){
//首先需要判断栈是否为空栈
if(top == -1){
throw new EmptyStackException();
}
return a[top--]; // 返回要删除的元素
}
2)链式栈
三、队列
1. 类比举例
队列可以类比汽车依次过隧道的例子。先到的车辆先出隧道,后到的车辆后出隧道。
2. 操作
队列在一端存数据,另一端取数据。
存数据的一端叫做队尾,取数据的一端叫做队头。
存数据的操作叫做入队,取数据的操作叫做出队。