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

S9 顺序队列

4.1顺序队列

4.1.1队列结构定义分析

#define MAX_SIZE 10typedef struct sqQueue {int data[MAX_SIZE]; // 存储数组int front; // 队头指针int rear; // 队尾指针} sqQueue;

关键特性

  • 数组存储:使用固定大小的数组存储队列元素
  • 双指针管理:front指向队头元素,rear指向队尾的下一个位置
  • 线性增长:指针只增不减,可能导致"假溢出"

4.1.2函数详细讲解与问题分析

1. 初始化函数 ( InitQue  ue )

void InitQueue(sqQueue* q) {assert(q != NULL);q->front = 0;q->rear = 0;}

代码解读

  • 正确初始化front和rear为0
  • 空队列条件: front =  = rear 
  • 符合顺序队列的基本初始化逻辑

2. 队列长度计算 ( QueueLe  ngth )

int QueueLength(sqQueue* q) {assert(q != NULL);return q->rear - q->front;}

关键点

  • 逻辑正确:rear - front就是元素个数
  • 时间复杂度O(1),效率很高
  • 这是顺序队列的标准长度计算方法

3. 入队操作 ( Enqueue )

bool Enqueue(sqQueue* q, int e) {assert(q != NULL);if(queuefull(q)) return false;q->data[q->rear] = e;q->rear++;return true;}

代码解读

  • 先检查队列是否已满
  • 在rear位置插入新元素,然后rear指针后移
  • 这是标准的入队操作逻辑

存在问题

  • 没有处理"假溢出":当rear达到MAX_SIZE但front>0时,实际上还有空间可用
  • 这是顺序队列的主要缺陷

4. 出队操作 ( Dequeue )

bool Dequeue(sqQueue* q, int* e) {assert(q != NULL);if(queueempty(q)) return false;*e = q->data[q->front];memmove(q->data + q->front, q->data + q->front + 1,(q->rear - q->front - 1) * sizeof(int));q->rear--;return true;}

5. 判空与判满函数

判空函数 ( queueem  pty )

bool queueempty(sqQueue* q) {assert(q != NULL);if (q->front == q->rear) return true;return false;}

关键点

  • 判断逻辑正确: front =  = rear 表示队列为空
  • 这是队列为空的标准判断条件
判满函数 ( queuefu  ll )bool queuefull(sqQueue* q) {assert(q != NULL);return (q->rear == MAX_SIZE);// 更准确的判断:return (q->rear == MAX_SIZE && q->front == 0);}

6. 获取队头元素 ( Gethead )

bool Gethead(sqQueue* q, int* e) {assert(q != NULL);if(queueempty(q)) return false;*e = q->data[q->front];return true;}

关键点

  • 逻辑正确:获取front位置的元素但不删除
  • 时间复杂度O(1),符合队列操作要求
  • 这是标准的获取队头元素方法

7. 打印函数 ( printf_  t )

正确实现

void printf_t(sqQueue* q) {assert(q != NULL);for (int i = q->front; i < q->rear; i++) {printf("%d ", q->data[i]);}}

4.1.3总结

时间复杂度总结

操作

你的实现

改进实现

标准要求

入队

O(1)

O(1)

O(1)

出队

O(n)

O(1)

O(1)

获取队头

O(1)

O(1)

O(1)

判空/判满

O(1)

O(1)

O(1)

学习建议

  1. 掌握循环队列:这是解决顺序队列假溢出问题的标准方案
  1. 理解队列本质:队列是FIFO结构,操作应该高效
  1. 注重算法复杂度:基础操作应该保持O(1)时间复杂度
  1. 实践动态扩容:学习如何实现队列的动态扩容机制

你的代码基本体现了顺序队列的概念,但需要重点改进出队操作的性能问题和实现循环队列来解决假溢出。掌握这些改进后,你对队列数据结构的理解会更加深入。 队列元素操作有关函数,包括add、remove、element、offer、poll、peek、put、get等基本操作。: 顺序队列的表示方法,使用一维数组存储,front和rear指针分别指示队头和队尾元素的位置。: 顺序队列中的"假上溢"现象,由于入队和出队操作中头尾指针只增加不减小,致使被删元素的空间无法重新利用。: 循环队列的判空和判满条件,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize。

http://www.dtcms.com/a/523584.html

相关文章:

  • 函数绑定器 std::bind
  • STM32基本定时器
  • 第9部分-性能优化、调试与并发设计模式
  • 编程素养提升之EffectivePython(Builder篇)
  • Vue 3 + TypeScript 项目性能优化全链路实战:从 2.1MB 到 130KB 的蜕变
  • 网站首页图腾讯 云上做网站教程
  • Ubuntu(Linux)安装更好用的中文输入法
  • 《算法闯关指南:优选算法--二分查找》--23.寻找旋转排序数组中的最小值,24.点名
  • 【ssh密钥】--- 当密钥密码遇见 Git 服务器:一场关于 “信任” 的浪漫喜剧
  • kotlin 数据类的get和set 问题
  • 爱站网功能左旗网站建设
  • 中国企业跨境云组网指南:低延迟访问德国AWS云做数据分析的实操方案
  • 从单机阅读到云端协作:KoodoReader+cpolar构建知识管理新范式
  • 设计模式之:命令模式
  • EulerOS(NPU)安装llamafactory
  • Ubuntu卸载snap
  • STP(生成树协议)与 RSTP(快速生成树协议)核心知识
  • 数据结构:顺序表讲解(2)
  • 建设一个网站需要考虑什么海口h5公司
  • 高端广告公司网站建设wordpress插件 stock
  • 第二章、全局配置项目主题色(主题切换+跟随系统)
  • 彻底清理:Vue项目中移除static文件夹的完整指南
  • 【Linux网络】套接字Socket编程预备
  • day18_菜单查询 合并servlet
  • 算法总结篇(枚举-分治)
  • TCP pure ACK 的不可扩展性问题
  • Android16 Wifi打开到自动连接的主要日志过程分析介绍
  • 背包dp——动态规划
  • 找做柜子的网站中国芯片制造最新消息
  • 甘肃省临夏州建设局网站wordpress 未分类