数据结构(C实现)------- 顺序队列(非循环队列)

数据结构—队列的顺序表示和实现--循环队列 和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个整型变量 front和rear分别指示队列头元素及队列尾元素 1.队列的顺序表示 typedef struct { int *base; // 分配存储空间 int front; // 队头指针 int rear; // 队尾指针 }SqQueue; ... 阅读详情

         和栈相反,队列是一种先进先出的的线性表。它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的队列是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫做队尾,允许删除的一端则稀烂为队头。

         顺序队列,即队列的顺序存储结构。由于队列的队头和队尾的位置均发生变化,因此在队列顺序存储结构中,除了用一组地址连续的存储单元依次存放从队头到队尾的元素之外,还需要附设两个指针front和rear指向队头和队尾元素。

        为了操作方便,在此约定:在非空队列中,队头指针front始终指向队头元素,而队尾rear始终指向队尾元素下一个位置。

      顺序队列的类型描述:        
//顺序队列的类型描述
#define MAXSIZE 100
typedef int ElemType;
typedef struct{
	ElemType *data;
	int front,rear;
}SqQueue;

      基本操作:

            1. 初始化顺序队列Init_SqQueue(SqQueue* Q):

//初始化顺序队列
void Init_SqQueue(SqQueue* Q){
    Q->data = (SqQueue*)malloc(sizeof(SqQueue) * MAXSIZE);

	Q->front = Q->rear = 0;	
}

           2. 销毁顺序队列Destroy_SqQueue(SqQueue* Q)

//销毁顺序队列
void Destroy_SqQueue(SqQueue* Q){
	if(Q->data){
		free(Q->data);
		Q->front = Q->rear = 0;
	}
} 

           3. 清空顺序队列Clear_SqQueue(SqQueue* Q)

//清空顺序队列
void Clear_SqQueue(SqQueue* Q){
	Q->front = Q->rear = 0;
}

          4. 判断顺序队列是否为空IsEmpty_SqQueue(SqQueue* Q)

//判断顺序队列是否为空
int IsEmpty_SqQueue(SqQueue* Q){
	if(Q->front == Q->rear)
		return 1;
	else{
		return 0;
	}
}

         5. 判断顺序队列是否已满iSFull_SqQueue(SqQueue* Q)

//判断顺序队列是否已满
int iSFull_SqQueue(SqQueue* Q){
	if(Q->rear == MAXSIZE)
		return 1;
	else
		return 0;
}

         因为没有设置额外的指针,所以这里判断顺序队列是否已满,实际上是假溢出,并不是真的顺序队列满,原因:

         随着入队,出队的进行,整个队列会整体向后移动,这样就出现队尾指针已经移动到了最后,再有元素入队就会出现队满,即溢出,而事实上此时队中并未真正的满员,这种现象即称为“假溢出”。

         

         6.  求得顺序队列的长度GetLength_SqQueue(SqQueue* Q)

//求得顺序队列的长度
int GetLength_SqQueue(SqQueue* Q){
	return Q->rear - Q->front;
}

        7. 取得顺序队列的的队头GetHead_SqQueue(SqQueue* Q,ElemType *x)

//取得顺序队列的的队头
void GetHead_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("顺序队列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[Q->front];
	}
}

         8. 取得顺序队列的的队尾GetRear_SqQueue(SqQueue* Q,ElemType *x)

//取得顺序队列的的队尾
void GetRear_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("顺序队列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[Q->rear - 1];
	}
}

        9. 入顺序队列En_SqQueue(SqQueue* Q,ElemType x)

//入顺序队列
void En_SqQueue(SqQueue* Q,ElemType x){
	if(iSFull_SqQueue(Q)){
		printf("顺序队列已满!\n");
		exit(0);
	}
	else{
		Q->data[Q->rear] = x;
		Q->rear++;
	}	
}


       10. 出顺序队列De_SqQueue(SqQueue* Q,ElemType *x)

//出顺序队列
void De_SqQueue(SqQueue* Q,ElemType *x){
	if(IsEmpty_SqQueue(Q)){
		printf("顺序队列空!\n");
		exit(0);
	}
	else{
		*x = Q->data[Q->front];
		Q->front++;
	}	
}

       11. 打印顺序队列Print_SqQueue(SqQueue* Q)

//打印顺序队列
void Print_SqQueue(SqQueue* Q){
	int i = Q->front;
	if(IsEmpty_SqQueue(Q)){
		printf("顺序队列空!\n");
		exit(0);
	}
	else{
		while(i < Q->rear)
			printf("%d\t",Q->data[i++]);	
		printf("\n");
	}
}

     

    说明:

          以上这种顺序队列会出现“假溢出”,随着入队,出队的进行,整个队列会整体向后移动,这样就出现队尾指针已经移动到了最后,再有元素入队就会出现队满,即溢出,而事实上此时队中并未真正的满员。

          为了能充分的利用空间,解决顺序队列的“假溢出”问题,可以采用两种方法:一种是将数据向前移动,让空的存储单元留在队尾;另一种是将顺序队列构造成一个环状的空间,即将队列的数据区data[0....MAXSIZE-1]看成头尾相接的循环结构,使得data[0]接在data[MAXSIZE-1]之后,这就是循环队列。







 

 

        

 

数据结构基础讲解(五)——队列专项练习 ADT Queue {数据对象:D={ai l ai 含于ElemSet ,i=1,2,…, n ,n>=0}数据关系:R={ <i-1,ai> | ai-1,ai含于D ,i=2, …, n}约定其中a1端为队列头,an端为队列尾。基本操作:(1)栈是限定仅在表尾进行插入或删除的线性表,又称为后进先出的线性表。栈有两种存储 表示,顺序表示(顺序栈) 和链式表示(链栈)。栈的主要操作是进栈和出栈,对千顺序栈的进栈 和出栈操作要注意判断栈满或栈空。(2) 队列是一种先进先出的线性表。 阅读详情

相关推荐

(二十一)第 3 章 栈和队列(非循环队列的顺序存储)

队列的基本操作

墨夜白 212

顺序栈和非循环队列来咯!!!

通过上几篇文章,我们一直在学习我们的线性表,我们学习了我们的顺序表,链表等相关线性表,那么我们今天来学习一下栈和队列这两种线性表叭!当然我们今天只介绍我们的顺序栈和非循环的队列。可能有小伙伴想问了:为什么不介绍链栈,共享栈,循环队列呢?原因很简单啊~我不会!当然,过几天应该会学会,过几天的事过几天再说。马上就进入我们的顺序栈和非循环队列当中吧。

zhuzhu_YT的博客 1031

C语言队列数据结构源码解析:顺序队列、链式队列、循环队列

队列是一种先进先出(First In First Out, FIFO)的数据结构,它有两个主要操作:入队(Enqueue)和出队(Dequeue)。入队操作指的是在队列尾部添加一个元素,而出队操作是指移除队列头部的元素。队列的操作原则保证了数据元素的进入顺序和离开顺序是相同的。为了维护队列的先进先出特性,顺序队列通常需要以下属性:- 队首(Front):指向队列头部第一个有效数据的索引。- 队尾(Rear):指向队列尾部下一个可插入新数据的位置的索引。

weixin_42584586的博客 959

【数据结构】非循环队列-顺序存储

队列概念 队列是对头出、队尾入的先进先出线性表。 需要两个指针front和rear分别来指向队头和队尾。 front指向队头元素的前一个位置,rear总是指向队尾元素。 进队:rear+1 出队:front+1 队空条件:front=rear 队满条件:rear = MaxSize - 1 代码 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define E...

BUG从入门到精通 943

iTunes登录协议全解析:从抓包到加密参数生成(含HTTPDebugger避坑指南)

本文深度解析iTunes登录协议,提供从环境搭建、绕过反调试机制到捕获网络流量的完整实战指南。重点剖析了如何利用HTTPDebugger等工具进行抓包,并详细解读了核心加密参数X-Apple-ActionSignature的生成逻辑,为网络安全研究员和协议分析工程师提供了一份详尽的逆向分析与协议复现教程。

weixin_28314575的博客 869

Windows如何使用Anaconda 3进行keras环境的配置

** Windows如何使用Anaconda 3进行keras环境的配置 搭建Keras环境* Anaconda3如何安装keras,主要包括下面三步: 1.安装mingw libpython 2.安装theano 3.安装keras 若你还没有按装anaconda,赶紧下载安装吧! 下载途径有两个 (1)Anaconda版本为Anaconda 4.4.0,对应的python版本为3.6,附上An...

Lance_liangliang的博客 1601

【C数据结构】非循环队列和循环队列(链表与顺序表实现)

非循环队列和循环队列

Ahaooooooo的博客 913

从光斑图到锤形优化:一次搞定Zemax双胶合透镜的像散与场曲问题

本文详细解析了Zemax双胶合透镜设计中像散与场曲问题的诊断与优化方法。从光斑图分析到锤形优化技巧,提供了完整的光学设计实战指南,帮助设计师快速定位问题并有效改善系统性能,特别适合光学设计工程师和Zemax使用者参考。

weixin_27134495的博客 233

【数据结构】非循环队列

/* 名称:非循环队列 编译环境:VC++ 6.0 日期: 2014年4月4日 */ #include #include #include #include typedef int QElemType; // 顺序队列(非循环,因为是非循环的,所以需要判断是否溢出 #define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1) typedef stru

徐刘根的博客 3464

告别复杂配置:dbswitch vs 传统工具(Kettle/DataX)在Greenplum数据同步中的性能对比

本文深入对比了新兴工具dbswitch与传统ETL工具Kettle、DataX在Greenplum数据同步中的表现。重点分析了dbswitch如何通过免中间文件、利用二进制COPY协议等设计,在异构数据库同步场景下实现更优的性能和更简化的配置,为技术选型提供清晰参考。

transformer2023的博客 1046

四阶龙格库塔方法求解一次常微分方程组

四阶龙格库塔方法求解一次常微分方程组一、写在前面二、四阶龙格库塔方法三、使用四阶龙格库塔方法求解一次常微分方程组 一、写在前面 龙格库塔方法是数值求解常微分非线性方程的有利工具,计算精度较高,通过缩短步进距离和增加阶数可以进一步控制误差范围。工程上较为常用的是四阶龙格库塔算法(R-K4),在计算收敛的情况下往往可以得到比较好的结果。 二、四阶龙格库塔方法 这里简单介绍一下算法的具体实现过程,不做详细的推导。其求解的问题是形如方程: y˙=f(y,t),其中t∈[t0,t1]初值y(t0)=c0 \dot{y

HelloWorldTM的博客 2万+

队列的运用与实现

队列的运用与实现栈的定义基本知识点栈的顺序结构及实现两栈共享空间栈的链式存储结构及实现栈的应用 栈的定义 栈(stack)是限定在表尾进行插入和删除操作的线性表。栈又称先进后出的线性表,简称LIFO结构。 基本知识点 允许插入和删除的一端叫做栈顶,另一端叫做栈底 栈的插入操作——进栈,栈的删除操作——出栈 其特征为:1用数组存储。2只允许在一端进行插入和删除。 3先进后出(LIFO),最先进...

lenfight的博客 414

SAP SD销售订单的ATP检查简介

如果可用性检查组设置为01(汇总需求),系统将更新销售订单需求到汇总表VBBS,该表中未记录销售订单号码,因此在MD04中不会显示销售订单号码,而是按天汇总显示销售需求。如果物料的可用性检查组设置为02(单个需求),系统将更新销售订单需求到表VBBE,该表中记录了销售订单号码,因此在MD04显示销售订单的号码以及需求,前面的文章中我们解释了PP模块中的ATP检查,也解释了MM模块中的ATP的检查,本文将说明一下SD模块中的ATP检查。可用性检查用的最多的就是02,有兴趣的同学可以测试一下可用性检查01。

我小时候很黑的博客 4297

【数据结构】二叉树的(先序、中序、后序、层次)遍历方法实现

包括二叉树的创建、四中遍历方法、还有销毁、输出二叉树形等其他操作。

Blog 232

GB28181 —— 3、C++编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

GB28181 —— Win10下编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

1309

全球APN信息汇总

全球APN信息,电信APN,移动APN,联通APN,台湾APN,马来西亚APN,俄罗斯APN,日本APN,泰国APN,美国APN,英国APN,法国APN,德国APN,意大利APN,葡萄牙APN,土耳其APN,荷兰APN,丹麦APN,比利时APN,爱尔兰APN,新加坡APN,越南APN,老挝APN,菲律宾APN,印尼APN,泰国APN,柬埔寨APN,巴基斯坦APN,印度APN,奥地利APN,保加利亚APN,捷克APN,立陶宛APN,罗马尼亚APN,挪威APN,希腊APN,匈牙利APN,瑞士APN,乌克兰APN

renkai721的专栏 2796

顺序队列

/* c3-3.h 队列的顺序存储结构(可用于循环队列和非循环队列) */ #define MAXQSIZE 5 /* 最大队列长度(对于循环队列,最大队列长度要减1) */ typedef struct { QElemType *base; /* 初始化的动态分配存储空间 */ int front; /* 头指针,若队列不空,指向队列头元素 */ int...

C语言、数据结构、算法 154

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【数据结构】队列(顺序表实现)的基本操作

队列的基本操作。

Blog 304

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

循环队列–C语言实现–数据结构

循环队列–C语言实现–数据结构目录循环队列C语言实现数据结构目录 一 要求 二 循环队列 三 循环队列的算法设计 1 建立循环队列 2 置空队列 3 入队 4 出队 5 打印队 四 程序 1 程序的结构 2 程序源码 五 程序测试 1 入队列 2 出队列 3 打印队列 六 源程序及封装软件下载 下载地址 格格是一枚智能专业的本科在校生很愿意和各位大佬交流如果大家有愿意交朋友的可以加格格的QQ4460

sinat_34450204的博客 45万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C语言版数据结构(从0开始) 4.队列

运算受限的线性表---队列1.队列的概念2.顺序队列2.1顺序队列的概念2.2非循环队列非循环队列中的溢出现象2.3循环队列循环队列的空满判别循环队列的基本运算3.链队列3.1 链队列的概念3.2链队列的基本运算 1.队列的概念 和栈一样,队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rea...

qq_44970368的博客 649

数据结构4-队列知识点大全,干货满满(C语言)

1. 队列的定义和基本操作 1.1 队列的定义 1. 队列:是一种操作受限的线性表,只能在队尾插入元素,在对头删除元素。 2. 特点: * 先进先出FIFO(first in first out) 3. 相关术语: 1. 队头 2. 队尾 3. 空队列 4. 队头元素 5. 队尾元素 1.2 队列的基本操作 1.3 队列的分类 * 队列的物理实现分类 1. 顺序结构 *...

渐渐的忘记,赶不上明天(读研ing,2024年毕业) 1862

看数据结构写代码(16)顺序队列的实现(循环队列)

循环队列的基本结构如下: front 属性 表示 队头,rear 属性表示 队尾。 在队空时 :q.rear 和 q.front 都为0 ,其余时刻q.rear 指向 队尾的后继节点,q.front指向 队头. 当在队尾插入元素时,q.rear + 1 ,在删除 队头元素时 ,q.front + 1,这样的操作 会造成 “假溢出”问题。 图(d) 就是一种 假溢出 问题,q.rea

fuming0210sc的专栏 1094

用c语言实现——顺序队列支持用户输入交互、入队、出队、查找、遍历、计算队列长度等功能。确定判断判满的方法为:牺牲一个存储单元方式

用c语言实现——顺序队列。判断队列已满或者空的情况是通过牺牲一个存储单元的方法来实现的。支持用户输入交互、入队、出队、查找、遍历等功能。

2401_84643729的博客 1027

数据结构-栈和队列

栈和队列

m0_63654706的博客 8702

C_栈和队列(ADT)-队列的非循环(带头指针)顺序表示和实现

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 顺序队列一次性要分配大量保证够用的空间,效率较高,因为是基于数组的,长度也是固定的。可以实现变长,但是一般代价较高。 队列的数据元素

Cynical丶Gary_博客 504
上一篇: android项目 之 记事本(10) ----- 手写功能之设置画笔大小和画笔颜色
下一篇: 数据结构(C实现)------- 顺序队列(循环队列之计数器实现)
jesson20121020
博客等级 码龄15年 361粉丝 99原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值