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

数据结构(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

相关文章:

  • 使用OpenCV进行图像处理:边界填充、阈值处理
  • Java 中 PriorityQueue 的底层数据结构及相关分析
  • 第60天:Web攻防-XSS跨站文件类型功能逻辑SVGPDFSWFPMessageLocalStorage
  • Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法
  • Hadoop 3.x中的zookeeper和JournalNode的作用
  • 使用vue3和vue-router实现动态添加和删除cachedViews数组
  • 提取关键 CSS: react 的项目中如何使用criticalCSS
  • PCRE2 站内搜索引擎项目
  • Windows 系统安装 Python3.7 、3.8、3.9、3.10、 3.11 最新版,附带相应程序。
  • 微信小程序面试内容整理-请求优化
  • 广东省教育服务公司受邀出席中华文化促进会教育示范基地落成典礼
  • 软考系统架构设计师考试学习和考试的知识点大纲,覆盖所有考试考点
  • Linux系统——crontab定时任务
  • 【Linux】——进程状态僵尸进程孤儿进程
  • Spring 如何创建 Bean 实例的?
  • SAP FAGLL03 追加并显示描述字段
  • 【C++图论 分支界限法】1786. 从第一个节点出发到最后一个节点的受限路径数|2078
  • 鸿蒙NEXT开发实战教程—小红书app
  • 第八:在Go语言项目中使用Zap日志库
  • 函数:形参和实参
  • 做音乐头像网站/优化神马网站关键词排名价格
  • 网站要挂工商标识怎么做/百度排名
  • 在建设部网站首页/百度登陆
  • 软件开发专业培训学校/百度seo推广怎么做
  • 纯html网站/网站子域名查询
  • 网站建设报价表/山东今日热搜