您的位置:首页 > 职场人生

面试题: 栈和队列的OC实现.

2016-07-09 15:30 316 查看
出坑了, 不知道什么时候再回来, 以后把它写完, 现在先删了.

栈的定义:

在介绍栈之前, 我们要先说一下什么是线性表.

线性表(linear list)是由n(n≥0)个数据元素所构成的有限xulie, 通常表示为(a0,a1,⋯,ai,⋯,an−1), 其中下标i标识数据元素在线性表中的位序号, n为线性表的表长, 当n=0时, 此线性表是空表. 线性表中的数据元素ai仅是一个抽象符号, 在不同的场合下代表不同的含义, 它可能是一个字母、数字、记录或更复杂的信息. 例如: 英文字母表(A,B,C,⋯,Z); TP-Link公司深圳分舵工资表中所有职工的工资按某种顺序排列得到表(4315.5,3523.4,2000,⋯,5432.1); 这两个表都可看成是一个线性表. 前者的数据元素是字母, 后者的数据元素是有理数, 并且这两者的数据元素都属于简单类型. 又如下表所示的是某些人的成绩表, 这个成绩表中的所有记录序列构成了一个线性表, 此线性表中的每一个数据元素都是由学号、姓名、大学英语、高等数学、计算机文化基础和总分6个数据项所构成的记录.

本成绩表纯属脑补, 如有雷同, 纯属巧合

学号姓名大学英语高等数学计算机文化基础总分
199981085海事姐姐658692243
200092092大表妹708290242
200911119婧哥759070235
200911123娟哥729076238
PS: 其实数院儿不用上高数…正如我目测海事姐姐大表妹她们应该不用上大计基一样= =另外感谢婧哥和娟哥两位女神告诉我学号~

顺便放一张我写掌厨时的福利图= =



由上述例子我们可以得到: 对于同一个线性表, 其每一个数据元素的值虽然不同, 但必须具有相同的数据类型; 同时, 数据元素之间具有一种线性的或“一对一”的逻辑关系, 即:

第一个数据元素没有前驱, 这个数据元素也称为开始结点.

最后一个数据元素没有后继, 这个数据元素也称为终端结点.

除第一个和最后一个数据元素之外, 其他数据元素有且只有一个前驱和一个后继.

具有上述逻辑关系的数据结构也称为线性结构. 线性表就是一种线性结构.

线性表就讲到这里了, 下面我们来看栈.

栈(stack)是一种特殊的线性表, 栈中的数据元素以及数据元素间的逻辑关系和线性表相同, 两者之间的差别在于: 线性表的插入和删除操作可以在表的任意位置进行, 而栈的插入和删除操作只允许在表的尾端进行. 其中, 栈中允许进行插入和删除操作的一段称为栈顶(top), 另一端称为栈底(bottom). 假设栈中的数据元素序列为(a0,a1,a2,⋯,an−1), 则a0称为栈底元素, an−1称为栈顶元素, n为栈中数据元素的个数(当n=0时, 栈为空). 通常, 咱将栈的插入操作称为入栈(push), 而将删除操作称为出栈(pop).

从栈的概念可知, 每次最先入栈的数据元素总是被放在栈的底部, 成为栈底元素; 而每次最先出站的总是那个放在栈顶位置的数据元素, 即栈顶元素. 因此, 栈是一种后进后出(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为队列中数据元素的个数. 当n=0时, 称为空队列. 队列的插入操作通常称为入队操作, 而删除操作通常称为出队操作.

队列在现实生活中处处可见, 例如: 海事姐姐在食堂排队买饭、大表妹在车站排队上车; 汽车排队进加油站等. 这些排队都有一个规则就是按先后顺序, 后来的只能在队列的最后排队, 先来的先处理再离开, 不能插队. 在生产建设中也有队列的应用, 例如: TP-Link公司路由器生产计划的调度就是根据一个任务队列进行. 队列也经常应用于码学领域中, 例如: 操作系统中存在各种队列, 有资源等待队列、作业队列等.

队列也是由n(n≥0)个具有相同类型的数据元素所构成的有限序列, 队列的基本操作与栈类似, 如下:

清空队列操作
clear()
: 将一个已经存在的队列置成空队列.

判空操作
isEmpty()
: 判断一个队列是否为空, 若为空, 则返回
YES
; 否则, 返回
NO
.

求队列长度操作
length()
: 返回队列中数据元素的个数.

取队首元素操作
peek()
: 读取队首元素并返回其值.

入队操作
offer(x)
: 将数据元素
x
插入到队列中, 使其成为新的队尾元素.

出队操作
poll()
: 删除队首元素并返回其值, 若队列为空, 则返回null.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: