#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct Queue {
int *data;
int head;
int tail;
int length;
int cnt;
} Queue;
Queue *init(int n) {
Queue *q = (Queue *)malloc(sizeof(Queue));
q->data = (int *)malloc(sizeof(int) * n);
q->length = n;
q->head = 0;
q->tail = 0;
q->cnt = 0;
return q;
}
int front(Queue *q) {
return q->data[q->head];
}
int empty(Queue *q) {
return q->cnt == 0;
}
int expand(Queue *q) {
if (!q) return 0;
int extr_size = q->length;
int *p = NULL;
while (extr_size) {
p = (int *)malloc(sizeof(int) * (q->length+extr_size));
if (q) break;
extr_size >>= 1;
}
if (!p) return 0;
for (int i = q->head, j = 0; j < q->cnt; i++, j++) {
p[i] = q->data[i%q->length];
}
free(q->data);
q->length += extr_size;
q->head = 0;
q->tail = q->cnt;
q->data = p;
return 1;
}
int push(Queue *q, int val) {
if (!q) return 0;
if (q->cnt >= q->length) {
if (!expand(q)) return 0;
printf("expand success! Queue->length(%d)\n", q->length);
}
q->data[q->tail++] = val;
q->tail %= q->length;
q->cnt++;
return 1;
}
#if 0
int push(Queue *q, int val) {
if (!q) return 0;
if (q->cnt >= q->length) return 0;
q->data[q->tail++] = val;
q->tail %= q->length;
q->cnt++;
return 1;
}
#endif
int pop(Queue *q) {
if (!q) return 0;
if (empty(q)) return 0;
q->head++;
q->head %= q->length;
q->cnt--;
return 1;
}
void output(Queue *q) {
printf("Queue : [");
for (int i = q->head, j = 0; j < q->cnt; i++, j++) {
printf("%d ", q->data[i%q->length]);
}
printf("]\n");
return ;
}
void clear(Queue *q) {
if (!q) return ;
free(q->data);
free(q);
return ;
}
int main() {
srand(time(0));
#define max_op 20
Queue *q = init(max_op);
for (int i = 0; i < max_op*3; i++) {
int val = rand() % 100;
int op = rand() % 4;
switch (op) {
case 0:
case 1:
case 2: {
printf("push %d to Queue = %d\n", val, push(q, val));
} break;
case 3: {
printf("pop %d from the Queue = ", front(q));
printf("%d\n", pop(q));
} break;
}
output(q), printf("\n");
}
#undef max_op
clear(q);
return 0;
}
相关推荐
自扩充的Lock-Free并发环形队列算法
环形链表具有避免申请释放节点元素的优点,但为了减少资源使用所以不能分配无穷大的节点数,只能根据具体需求分配一定数量的节点数,正因为如此,可能由于对系统分析不足而导致初始化的节点数不一定能满足队列的容量需求,这个时候就需要队列具有自适应的扩充队列节点数的功能,基于锁(Lock-Base)的算法实现扩充是相当容易的,但基于锁无关(Lock-Free)实现起来难度较大,下面将使用伪代码介绍基于Lock-Free实现可自适应扩充的环形并发队列算法,并提出了优化方案以使特定环境下能再提高队列效率。
【上机实验】03:循环队列与扩容
循环队列与扩容 1.顺序队列操作 #include<stdio.h> #include<stdlib.h> #include<time.h> typedef struct{ int *data; int front, rear; int length; }SqQueue; //1.队列初始化 SqQueue *InitQueue(int n){ SqQueue *sq = (SqQueue *)malloc(sizeof(SqQueu
可扩充循环队列
可扩充循环队列可扩充循环队列可扩充循环队列可扩充循环队列可扩充循环队列
循环队列如何根据实际需要动态地扩展空间?
循环队列可以使用动态数组的实现方式来动态地扩展空间。 当队列满时,我们可以创建一个新的更大的数组,然后把旧数组中的数据拷贝到新数组中,再将旧数组指针指向新数组,这样就可以继续向队列中添加元素了。 但是,当我们扩展数组的大小时,需要注意保证队列的循环性,也就是说,需要把队列的队尾元素正确地放在新数组的最后一个位置。 例如,假设当前队列的容量为 4,已有元素 A, B, C, D,其中队尾元素为 D,...
AppStore逆向分析:从网络抓包到自动化模拟的完整实践
在移动应用生态中,理解客户端与服务器之间的通信协议是进行自动化测试、数据分析和系统集成的关键技术基础。通过分析网络请求与响应,可以深入理解认证、会话管理和数据交换的原理,这对于构建稳定的自动化流程至关重要。其技术价值在于能够实现合法场景下的流程模拟,例如应用元数据监控、沙盒环境测试或内部工具开发。在实际应用场景中,开发者常需处理登录态维持、请求签名验证及风控策略应对等挑战。本文聚焦于AppStore这一封闭生态,详细拆解了其登录、查询等核心环节的通信机制,并探讨了使用Python结合抓包工具进行安全逆向分析
基于gem5模拟trace的cache模拟器的实现
在做计算机体系结构的时候,模拟器是一个重要且又有效的工具。其中gem5集成了gem和m5的优点,使用起来比较简单和方便。其中包括了se模式和fs模式,se模式是在gem5运行我们已经编译好的程序,可以获取cache,cpu状态等数据,fs模式下可以模拟操作系统,我们可以将我们自己修改的linux内核加载到哥们上运行。下面介绍了使用gem5的se模式,运行编译好的ARM可执行文件。获取访存的trac
【队列】可扩容顺序队列
可扩容的循环顺序队列
跨模态行人重识别实战:Python复现SYSU-MM01官方评估协议
本文详细介绍了如何用Python复现SYSU-MM01数据集的官方评估协议,以解决原Matlab代码在Python生态中不便使用的问题。文章深入解析了数据集的`indoor`与`all`两种评估模式,并提供了完整的Python代码实现,包括特征加载、相似度计算、Rank-k与mAP指标计算等核心步骤,确保评估结果与官方Matlab版本完全一致,助力跨模态行人重识别研究。
队列扩容
template<class T> void Queue<T>::Push(const T& item){ /*if (rear == capacity-1) { rear = 0; } else { rear++; }*/ //判断队列是否存满 if ((rear+1)%capacity == front) { //加倍 ...
PADS VX2.7学习记录06-PADS Router软件功能操作
PADS VX2.7学习记录06-PADS Router软件功能操作
IntelliJ IDEA 中git使用说明书
IntelliJ IDEA 中git使用说明书
Java实现循环队列(可以自动扩容)
Java实现循环队列(可以自动扩容) 先声明接口interface Queue<E> //适用泛型 public interface Queue<E> { int getSize(); boolean isEmpty(); void enqueue(E e);//入队 E dequeue();//出队 E getFront();//获得队首元素 } clas...
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)
生存和射击游戏一直是我的最爱,说起3D最普遍的应该就是射击系统了,你可以在任何情况下加入射击功能,所以我写下了这篇FPS开发记录。希望对你有帮助。在这个项目中,你将学习如何设计和实现射击系统、武器系统、玩家控制、场景设计等方面的内容。通过这个项目,你将深入了解游戏开发中的许多核心概念和技术,并且在实践中不断提升自己。本项目将带你从零开始逐步实现一个完整的第一人称射击游戏,并且会逐步引入一些高级功能,如特效、声音等。
动态循环队列扩容逻辑实现
本文介绍了队列的基本概念及其顺序表实现方式。队列是一种先进先出的数据结构,传统顺序表实现存在空间浪费问题。为解决该问题,提出了循环队列策略,通过模运算实现逻辑上的首尾连接。文章详细分析了循环队列的实现原理,并讨论了扩容处理的两种方法
基于Simulink和Control System Toolbox的线控转向(Steer-by-Wire)系统设计
通过上述步骤,我们成功设计并实现了基于 Simulink 和 Control System Toolbox 的线控转向(Steer-by-Wire)系统。该系统能够接收来自方向盘的角度指令,经过控制器处理后,驱动转向执行器(如电动机),实现对车辆前轮转向角度的精确控制。通过虚拟场景仿真、硬件在环测试和实车测试,验证了系统的响应速度、控制精度、车辆稳定性和实时性能,并通过参数优化进一步提升了系统的性能。
Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法
使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。
数组实现可扩容循环队列
/** * @author zfl * 数组实现可扩容循环队列 */ public class Queue { private Object[] queArray; private int maxSize; private int front; private int rear; private int nItems; public Queue(int initialCapa...
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
java 通过数组实现循环队列CircleQueue,并实现动态扩容
介绍: 上次我是通过单链表实现的队列Queue, 这次是通过数组实现的循环队列,并且实现了动态扩容,动态扩容的思想和我之前写的MyArrayList基本一致。 对外提供的接口: 源代码: package algorithmBeauty.dataStructure.queue; /** * @author : HuXuehao * @date : 2021年4月21日上午8:47:57 * @Description 通过数组实现队列 并 实现动态扩容 * @version : */ @Suppre
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
C语言实现循环队列的构建、入队、出队、扩容、遍历等操作
C语言实现循环队列的构建、入队、出队、扩容、遍历等操作 一 队列的定义和初始化 在C++的STL中有queue可以直接使用,小编这里采用C语言实现队列的基本操作,毕竟学会自己“造轮子”而不是拿来主义,可以更深刻的体会队列的性质。 队列最大的性质就是先进先出,元素只可以从队尾入队,从队首出队列。至于队列和循环队列之间的区别,不及,我们后面会说。 话不多说,我们直接看数据结构定义: typ...
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
《队列与栈:从基础到循环队列与动态扩容的深度解析》
应用场景:函数调用栈、表达式求值、浏览器前进后退。应用场景:消息队列、CPU任务调度、打印缓冲区。静态数组实现适合教学,生产环境需动态结构。循环队列解决空间浪费,动态栈突破容量限制。:通过取模运算实现数组空间循环利用。"理解数据结构的最好方式是手写实现,逻辑简单直观,时间复杂度 O(1)到达数组末尾后无法复用前部空间。实际可用空间 << 数组容量。:空间不足时自动扩展容量。:锁与CAS的实现差异(FIFO(先进先出)结构。LIFO(后进先出)结构。均摊时间复杂度 O(1):结合队列与栈的特性(
循环队列(不扩容)
扩容比较麻烦,这里不实现,同时实际最大大小只有maxsize-1,用于区分和栈为空的情况。
C#数组实现循环队列:从假溢出到动态扩容的完整指南
队列作为一种基础数据结构,其先进先出(FIFO)特性在计算机科学中有着广泛的应用。从操作系统任务调度到网络请求处理,队列都扮演着关键角色。在C#开发中,队列不仅是常用数据结构,更是理解消息队列等高级概念的基础。数组实现队列面临的核心挑战是“假溢出”问题,即数组物理空间未满但逻辑上无法继续插入。循环队列通过取模运算将数组首尾相连,有效解决了这一难题。本文以C#为例,详细讲解如何实现一个支持动态扩容的泛型循环队列,涵盖指针移动、空满判断、数据迁移等关键技术细节,并对比了链式队列的缓存友好性差异。掌握数组队列的实
包含泛型的可扩容循环队列的数组实现
/** * * @author zfl * @param <E> * 包含泛型的可扩容循环队列的数组实现 * */ public class PriorityQueue<E extends Comparable<? super E>> { private int size; private E[] queArray; private int...
什么是队列(基础概念/顺序队列/链式队列/动态扩容/循环队列)含示例代码
定义 如何理解“队列” 队列是一个操作受限的线性表 具有先进先出的性质 跟「栈」一样,分为顺序队列和链式队列 用数组实现的顺序队列和用链表实现的链式队列 主要要关注队满和队空条件 线性队列 > 队满:tail == n | 队空(没有数据):head == tail 链式队列 > 队满:无界 | 队空:head.next = tail 线性队列的数据搬迁:当队满时,...
【C】自定义实现循环队列 queue 入队、出队和扩容(非链队列)(code c)
目录&索引程序代码实现队列queue循环插入和删除 code c运行结果结论 程序代码 实现队列queue循环插入和删除 code c #include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct Queue { int *data; int head, tail, size; // tail指向末尾元素的下一个位置 int count; } Queue;
循环队列
目录循环队列入队扩容出队 循环队列 如图,判断循环队列是否已满是根据队首front和队尾tail的关系。如果数组的最后一个位置已有元素,但是队首前面依然有空格也不表示队列已满。需要注意的是,我们需要空余出一个位置来,以图中为例,此时“tail+1= =front”,如果继续填入元素,那么tail==front,和判断队列是否为空——“front= =tail”就冲突了。因此当“tail+1= =...
1688



被折叠的 条评论
为什么被折叠?



