出坑了, 不知道什么时候再回来, 以后把它写完, 现在先删了.
栈的定义:
在介绍栈之前, 我们要先说一下什么是线性表.
线性表(linear list)是由n(n≥0)个数据元素所构成的有限xulie, 通常表示为(a0,a1,⋯,ai,⋯,an−1), 其中下标i标识数据元素在线性表中的位序号,
本成绩表纯属脑补, 如有雷同, 纯属巧合
学号 | 姓名 | 大学英语 | 高等数学 | 计算机文化基础 | 总分 |
---|---|---|---|---|---|
199981085 | 海事姐姐 | 65 | 86 | 92 | 243 |
200092092 | 大表妹 | 70 | 82 | 90 | 242 |
200911119 | 婧哥 | 75 | 90 | 70 | 235 |
200911123 | 娟哥 | 72 | 90 | 76 | 238 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
PS: 其实数院儿不用上高数…正如我目测海事姐姐大表妹她们应该不用上大计基一样= =另外感谢婧哥和娟哥两位女神告诉我学号~
顺便放一张我写掌厨时的福利图= =
由上述例子我们可以得到: 对于同一个线性表, 其每一个数据元素的值虽然不同, 但必须具有相同的数据类型; 同时, 数据元素之间具有一种线性的或“一对一”的逻辑关系, 即:
- 第一个数据元素没有前驱, 这个数据元素也称为开始结点.
- 最后一个数据元素没有后继, 这个数据元素也称为终端结点.
- 除第一个和最后一个数据元素之外, 其他数据元素有且只有一个前驱和一个后继.
具有上述逻辑关系的数据结构也称为线性结构. 线性表就是一种线性结构.
线性表就讲到这里了, 下面我们来看栈.
栈(stack)是一种特殊的线性表, 栈中的数据元素以及数据元素间的逻辑关系和线性表相同, 两者之间的差别在于: 线性表的插入和删除操作可以在表的任意位置进行, 而栈的插入和删除操作只允许在表的尾端进行. 其中, 栈中允许进行插入和删除操作的一段称为栈顶(top), 另一端称为栈底(bottom). 假设栈中的数据元素序列为(a0,a1,a2,⋯,an−1), 则a0称为栈底元素, an−1称为栈顶元素, n为栈中数据元素的个数(当
从栈的概念可知, 每次最先入栈的数据元素总是被放在栈的底部, 成为栈底元素; 而每次最先出站的总是那个放在栈顶位置的数据元素, 即栈顶元素. 因此, 栈是一种后进后出(Last In First Out, LIFO), 或先进后出(First In Last Out, FILO)的线性表.
在现实生活中, 有许多具有栈的特性(运算受限)的应用实例. 例如, 刘哥吃完饭后收拾桌子抱出的一叠盘子可以被看作是一个栈, 因为取出盘子和添加盘子的操作满足”后进先出”或”先进后出”的原则, 还有火车调度也被视为是一个栈的模型.
尽管栈的特性降低了栈的插入与删除操作的灵活性, 但这种特性使栈的操作更为有效、更易实现. 栈在计算机应用中也导出可见, 例如, 浏览器对用户当前访问过地址的管理、键盘缓冲区中对键盘输入信息的管理等都采用了栈式结构.
栈也是由n(n≥0)个数据元素所构成的有限序列, 其数据元素的类型可以任意, 但只要是同一种类型即可. 根据栈的特性, 定义在栈的抽象数据类型中的基本操作如下:
- 置栈空操作(参考方法命名:
clear
): 将一个已经存在的栈置成空栈. - 判栈空操作(参考方法命名:
isEmpty
): 判断一个栈是否为空, 若栈为空, 则返回TRUE; 否则, 返回FALSE. - 求栈中数据元素个数操作(参考方法命名:
length
): 返回栈中数据元素的个数. - 取栈顶元素操作(参考方法命名:
peek
):读取栈顶元素并返回其值, 若栈为空, 则返回null. - 入栈操作(参考方法命名:
push:
): 将数据元素x
压入栈顶. - 出栈操作(参考方法命名:
pop
): 删除并返回栈顶元素.
队列的定义:
队列是另一种特殊的线性表, 它的特殊性体现在队列只允许在表尾插入数据元素, 在表头删除数据元素, 所以队列也是一种操作受限的特殊的线性表, 它具有先进先出(First In First Out, FIFO)或后进后出(Last In Last Out, LILO)的特性.
允许进行插入的一端称为队尾(rear), 允许进行删除的一端称为队首(front). 假设队列中的数据元素序列为{a0,a1,a2,⋯,an−1}, 则称其中a0为队首元素, 称an−1为队尾元素, n为队列中数据元素的个数. 当
队列在现实生活中处处可见, 例如: 海事姐姐在食堂排队买饭、大表妹在车站排队上车; 汽车排队进加油站等. 这些排队都有一个规则就是按先后顺序, 后来的只能在队列的最后排队, 先来的先处理再离开, 不能插队. 在生产建设中也有队列的应用, 例如: TP-Link公司路由器生产计划的调度就是根据一个任务队列进行. 队列也经常应用于码学领域中, 例如: 操作系统中存在各种队列, 有资源等待队列、作业队列等.
队列也是由n(n≥0)个具有相同类型的数据元素所构成的有限序列, 队列的基本操作与栈类似, 如下:
- 清空队列操作
clear()
: 将一个已经存在的队列置成空队列. - 判空操作
isEmpty()
: 判断一个队列是否为空, 若为空, 则返回YES
; 否则, 返回NO
. - 求队列长度操作
length()
: 返回队列中数据元素的个数. - 取队首元素操作
peek()
: 读取队首元素并返回其值. - 入队操作
offer(x)
: 将数据元素x
插入到队列中, 使其成为新的队尾元素. - 出队操作
poll()
: 删除队首元素并返回其值, 若队列为空, 则返回null.