栈和队列
前言
本章的内容并不难,重点需要理解的是栈和队列是操作受限的线性表,是在前一章线性表的基础上增加了一些约束条件。另外本章涉及到递归的概念,这个在后面章节有更多的应用,一定要重点理解掌握~
1 栈和队列的定义和特点
栈和队列是两种常用的、重要的数据结构
栈和队列是限定插入和删除只能在表的“端点”进行的线性表
栈和队列是线性表的子集(是插入和删除位置受限的线性表)
普通线性表:插入范围为:1~n+1 删除范围为:1~n
栈:插入只能是插入在n+1位置,删除只能是在n位置(后进先出)
由于栈的操作具有后进先出的固有特性,使得栈成为程序设计中的有用工具。另外,如果问题求解的过程具有“后进先出”的天然特性的话,则求解的算法中也必然需要利用“栈”
队列:插入只能是插入在n+1位置,删除只能是在1位置(先进先出)
由于队列的操作具有先进先出的特性,使得队列成为程序设计中解决类似排队问题的有用工具
1.1 栈的定义和特点
栈(stack)是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表,又称为后进先出(Last In First Out)的线性表,简称LIFO结构
栈的相关概念
栈是仅在表尾进行插入、删除操作的线性表
表尾(即an端)称为栈顶Top,表头(即a1端)称为栈底Base
插入元素到栈顶(即表尾)的操作,称为入栈 “入” = 压入 = PUSH(x)
从栈顶(即表尾)删除最后一个元素的操作,称为出栈 “出” = 弹出 = POP(y)
(1)定义
限定只能在表的一端进行插入和删除运算的线性表(只能在栈顶操作)
(2)逻辑结构
与线性表相同,仍为一对一关系
(3)存储结构
用顺序栈或链栈存储均可,但以顺序栈更常见
(4)运算规则
只能在栈顶运算, 且访问结点时依照后进先出(LIFO)的原则
(5)实现方式
关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同
栈与一般线性表的区别:仅在于运算规则不同
一般线性表运算规则是随机存取,栈则是后进先出(LIFO)
1.2 队列的定义和特点
队列(queue)是一种先进先出(Frist In Frist Out ---- FIFO)的线性表。在表一端插入(表尾),在另一端(表头)删除
队列的相关概念
(1)定义
只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表(头删尾插)
(2)逻辑结构
与线性表相同,仍为一对一关系
(3)存储结构
顺序队或链队,以循环顺序队列更常见
(4)运算规则
只能在队首和队尾运算, 且访问结点时依照先进先出(FIFO)的原则
(5)实现方式
关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同
2 案例引入
案例1:进制转换
十进制整数N向其他进制数d(二、八、十六)的转换是计算机实现计算的基本问题
转换法则:除以d倒取余
该转换法则对应于一个简单算法原理:n = (n div d)d +