目录
二、队列
(一)、定义
1. 定义
2. 逻辑结构
3. 存储结构
4. 运算规则
5. 实现方式
(二)、队列与一般线性表的区别
一般线性表
队列
(三)、分类
1、顺序队列:队列的顺序表示(用一维数组)
1.1队列的顺序表示--用一维数组base[M]
存在问题
2、循环队列
2.1 循环队列初始化
2.2判断对空
2.3、循环队列入队----环状位移要取余
2.4、获取队首元素
3.链式队列:用单链表表示
3.1判断队空
3.2、链式入队
3.3、链式队列出队
3.4、获取队首元素
二、队列
(一)、定义
1. 定义
只能在表的一端(队尾)进行插入,在另一端(队首或队头)进行删除运算的线性表
2. 逻辑结构
与线性表相同,仍为一对一关系
3. 存储结构
用顺序队列或链式队列存储均可
4. 运算规则
先进先出(FIFO)
5. 实现方式
关键是编写入队和出队函数,具体实现依顺序队或链队的不同而不同
(二)、队列与一般线性表的区别
队列是一种特殊(操作受限)的线性表
区别:仅在于运算规则不同
一般线性表
逻辑结构:一对一
存储结构:顺序表、链表
运算规则:随机、顺序存取
队列
逻辑结构:一对一
存储结构:顺序队列、链式队列
运算规则:先进先出
(三)、分类
1、顺序队列:队列的顺序表示(用一维数组)
利用一组连续的存储单元(一维数组) 依次存放从队首到队尾的各个元素,称为顺序队列。
顺序队列定义如下:
class SeqQueue:def __init__(self, max):self.max = max # 队列最大容量# 存储队列元素的数组self.data = [None for i in range(self.max)]self.front = 0 # 队首指针self.rear = 0 # 队尾指针
1.1队列的顺序表示--用一维数组base[M]
入队和出队
存在问题
真假溢出
解决办法-----循环队列
2、循环队列
2.1 循环队列初始化
class CircleQueue(object):def __init__(self,max):# 队列最大容量self.max = max# 存储队列元素的数组self.data = [None for i in range(self.max)]# 队首指针self.front = 0# 队尾指针self.rear = 0
2.2判断对空
class CircleQueue(object):def __init__(self,max):# 队列最大容量self.max = max# 存储队列元素的数组self.data = [None for i in range(self.max)]# 队首指针self.front = 0# 队尾指针self.rear = 0
2.3、循环队列入队----环状位移要取余
def push(self,val):''':Desc 入队 :param val:待入队关键字'''# 如果队列满了,抛出异常if (self.rear + 1) % self.max == self.front:raise IndexError("队列为满")# 在队尾插入新的关键字self.data[self.rear] = val# 修改队尾指针self.rear = (self.rear + 1) % self.max
2.4循环队列出队
def pop(self):''':Desc 将队首元素出队'''# 如果队列为空,抛出异常if self.empty():raise IndexError("队列为空")# 队列不为空,获取队首元素cur = self.data[self.front]# 修改队首指针,指向下一个位置self.front = (self.front + 1) % self.max# 返回原队首元素return cur
2.4、获取队首元素
def pop(self):''':Desc 将队首元素出队'''# 如果队列为空,抛出异常if self.empty():raise IndexError("队列为空")# 队列不为空,获取队首元素cur = self.data[self.front]# 修改队首指针,指向下一个位置self.front = (self.front + 1) % self.max# 返回原队首元素return cur
3.链式队列:用单链表表示
设立一个队首指针front ,指向队首元素。
初始化:front=None。
入队:判断队列是否为空。如果队列为空,将队首指针指向待插入的新节点。若队列不为空,则遍历到队尾元素,将新节点插入到队尾。
出队:首先判断队列是否为空,若是队列为空,则抛出异常;否则,删除队首节点。
队列为空:front is None。
class Node(object):def __init__(self,data):''':Desc 队列节点存储结构'''# 数据域self.data = data# 指针域self.next = None
class LinkedQueue(object):def __init__(self):''':Desc 队列初始化'''# 队首指针指向空self.front = None
3.1判断队空
class LinkedQueue(object):def __init__(self):''':Desc 队列初始化'''# 队首指针指向空self.front = None
3.2、链式入队
入队:判断队列是否为空。如果队列为空,将队首指针指向待插入的新节点。若队列不为空,则遍历到队尾元素,将新节点插入到队尾。
def push(self,val):''':Desc 将关键字入队 :param val: 关键字'''# 新节点new = Node(val)# 如果队列为空if self.front == None:# 将队首指针指向新节点self.front = new# 如果队列不为空else:# 声明cur指针cur = self.front# 通过cur指针遍历队列while cur.next != None:cur = cur.next# 在队尾插入元素cur.next = new
3.3、链式队列出队
出队:首先判断队列是否为空,若是队列为空,则抛出异常;否则,删除队首节点
def pop(self):''':Desc 将队首元素出队'''# 如果队列为空,抛出异常if self.empty():raise IndexError("队列为空")# 如果队列不为空else:cur = self.front# 将队首指针指向队首节点的后继节点self.front = self.front.next# 返回原本队首节点return cur
3.4、获取队首元素
peek(self):''':Desc 获取队首元素 :return: 返回队首元素'''# 如果队列为空,抛出异常if self.empty():raise IndexError("队列为空")# 如果队列不为空else:# 返回队首元素return self.front