当前位置: 首页 > article >正文

数据结构(python)-------栈和队列2

目录

二、队列

(一)、定义

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


http://www.kler.cn/a/594710.html

相关文章:

  • 【Ragflow】2. rag检索原理和效率解析
  • 私域电商的进化逻辑与技术赋能:基于开源AI大模型与S2B2C商城的创新融合研究
  • 深度学习pytorch笔记:TCN
  • Vs code搭建uniapp-vue项目
  • DAY35贪心算法Ⅳ 重叠区间问题
  • Java 大视界 -- Java 大数据在智能政务舆情引导与公共危机管理中的应用(138)
  • Flask 模版引擎的语法
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(10)
  • Redis 在windows下的下载安装与配置
  • 医院信息系统平台总体架构原则
  • 创造型设计模式
  • canvas数据标注功能简单实现:矩形、圆形
  • <el-form >ref数据监测不到的原因
  • 将MySQL数据同步到Elasticsearch作为全文检索数据的实战指南
  • 【从零开始学习计算机科学与技术】计算机网络(五)网络层
  • RocketMQ 架构
  • ssm_mysql_校园二手交易系统
  • 数据结构:用C语言实现插入排序
  • 设计模式,如单例模式、观察者模式在什么场景下使用
  • 在Oracle Linux 7上安装Oracle 11gr2数据库