C语言实现顺序循环队列实例

 更新时间:2022年02月10日 14:35:16   作者:犀牛超人  
大家好,本篇文章主要讲的是C语言实现顺序循环队列实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

一、队列和循环队列基本概念

队列:

和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另一端删除。

允许插入的叫"队尾"(rear),允许删除的叫"队头"(front)。

入队操作:L->rear++;   L->data[L->rear]=x;(需要入队的元素)

出队操作:L->front++;  x=L->data[L->front];

求队长:队长=(L->rear)-(L->front);

队空:L->rear==L->front==-1;

队满:队长=max

使用场景:一切具备先来后到的任务场景

循环队列:

  和队列类似,只不过队头和队尾相连,解决了队列的假溢出现象(队尾指针达到申请空间的最大时,系统会认定空间满,但是队头指针如果不为-1则就是假溢出)。
入队:L->rear==(L->rear+1)%max;
出队:L->front==(L->front+1)%max;
队满:由图可知 队满和队空条件重复,所以为了避免这一情况现如今有两种方法:1.少用一个元素空间,也就是说front指针在定义时指向0的位置,这样才能使front和rear之间空出一个元素空间。2.这个方法比较容易理解,就是定义一个Num值来记录元素个数,num==0时则队空,num==max时则队满。
具体操作:(L->rear+1)%max==front;  num==max;

队空:L->rear==L->front;
队长:分两种情况:1.头指针在尾指针之后:按普通队列求法。2.头指针在尾指针之前:队长=L->rear+(max-(L->front));

二、代码实操

 图示:

 具体代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ture 1
#define false 0
#define max 5
typedef struct {
	int data[max];
	int front,rear;
}cteam,*team;
static int num=0;  //全局变量 num  
//初始队列
int Initteam(team &L){
	L=(cteam *)malloc(sizeof(cteam));
	if(L==NULL){
		printf("申请空间失败!");
		return false;
	}
	L->front=L->rear=-1;
	return true;
}
//入队
int pushteam(team &L,int x){
	if(num==max){
		printf("队满");
		return false;
	}else{
		L->rear=(L->rear+1)%max;  //rear始终在0-10中循环
		L->data[L->rear]=x; 
		num++;
		return true;
	}
} 
//出队
int popteam(team &L,int &x){
	if(num==0){
		printf("队空!");
		return false;
	}else{
		L->front=(L->front+1)%max;  //front始终在0-10中循环
		x=L->data[L->front];
		num--;
		printf("\n%d出队\n",x);
		return x;
	} 
}
//遍历队
void printteam(team L){
	int p;
	p=L->front+1;
	if(L->front<L->rear){
		while(p<=L->rear){
		printf("%d ",L->data[p]);
		p++;}
	}else{
		while((p-1)!=L->rear){
			printf("%d ",L->data[p]);
			p=(p+1)%max;
		}
	}
  }
//求队长 
 int teamlength(team L){
 	int p;
 	if(L->front<L->rear){
 		p=(L->rear)-(L->front);      //当队列正常时 
	 }else{
	 	p=L->rear+(max-(L->front));  //当队列开始循环时 
	 }
	printf("\n队长为:%d",p);
 }
 //取队头元素
  int gettop(team L){
  	if(L->front==L->rear){
  		printf("队空!");
  		return false;
	  }else{
	  	int t=L->data[L->front+1];
	  	return t;
	  }
  } 
  
  
  /*     
  		pushteam:入队函数	popteam:出队函数 
  		printteam:遍历函数	gettop:取队头函数 
  		Initteam:初始化函数	teamlength:求队长函数 
  */
  
  
int main(){
	team s;
	int w;
	Initteam(s);
	//1-3进队列 
	pushteam(s,1);      
	pushteam(s,2);
	pushteam(s,3);
	printf("------1-3进队列后----------\n");
	printf("此时队列为:");
	printteam(s);
   	popteam(s,w);
	popteam(s,w);
	printf("此时队列为:");
	printteam(s);
	printf("\n------4-6进队列后----------\n");
	pushteam(s,4);
	pushteam(s,5);
	pushteam(s,6);
	printf("此时队列为:");
	printteam(s);
	teamlength(s);
	int T=gettop(s);
	printf("\n队头元素为:%d",T);
}

实现结果:

总结

到此这篇关于C语言实现顺序循环队列实例的文章就介绍到这了,更多相关C语言顺序循环队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈C++11中=delete的巧妙用法

    浅谈C++11中=delete的巧妙用法

    本文主要介绍了C++11中=delete的巧妙用法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 关于C++内部类的介绍与使用示例

    关于C++内部类的介绍与使用示例

    今天小编就为大家分享一篇关于关于C++内部类的介绍与使用示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言实现求解最小公倍数的算法示例

    C语言实现求解最小公倍数的算法示例

    这篇文章主要为大家介绍了C语言如何实现求解任意两个正整数的最小公倍数,文中采用了穷举法和定理法。感兴趣的小伙伴快来跟随小编一起学习学习吧
    2021-12-12
  • 关于C++智能指针shared_ptr和unique_ptr能否互转问题

    关于C++智能指针shared_ptr和unique_ptr能否互转问题

    C++中的智能指针最常用的是shared_ptr和unique_ptr,C++新手最常问的问题是我从一个函数中拿到unique_ptr,但要转成shared_ptr才能使用,要怎么转换?同理是否能将shared_ptr转换成unique_ptr,面对这些问题,跟随小编一起看看吧
    2022-05-05
  • 使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法

    使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法

    这篇文章主要介绍了使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C++实现LeetCode(135.分糖果问题)

    C++实现LeetCode(135.分糖果问题)

    这篇文章主要介绍了C++实现LeetCode(135.分糖果问题),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现数组栈的代码示例

    C语言实现数组栈的代码示例

    栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,本文给大家介绍了C语言实现数组栈的代码示例,需要的朋友可以参考下
    2024-07-07
  • 哈夫曼的c语言实现代码

    哈夫曼的c语言实现代码

    着先通过 HuffmanTree() 函数构造哈夫曼树,然后在主函数 main()中自底向上开始(也就是从数组序号为零的结点开始)向上层层判断,若在父结点左侧,则置码为 0,若在右侧,则置码为 1。最后输出生成的编码
    2013-07-07
  • C++使用OpenCV实现证件照蓝底换成白底功能(或其他颜色如红色)详解

    C++使用OpenCV实现证件照蓝底换成白底功能(或其他颜色如红色)详解

    这篇文章主要介绍了C++使用OpenCV实现证件照蓝底换成白底功能(或其他颜色如红色),结合实例形式详细分析了OpenCV颜色转换相关操作原理与实现技巧,需要的朋友可以参考下
    2019-12-12
  • C语言类型转换与常量的细节深入理解探究

    C语言类型转换与常量的细节深入理解探究

    这篇文章主要为大家介绍了C 语言类型转换与常量的细节深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论