大家好,本篇文章主要讲的是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语言实现顺序循环队列实例
基础教程推荐
- C/C++编程中const的使用详解 2023-03-26
- 详解c# Emit技术 2023-03-25
- C++详细实现完整图书管理功能 2023-04-04
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- 一文带你了解C++中的字符替换方法 2023-07-20
- C利用语言实现数据结构之队列 2022-11-22
- 如何C++使用模板特化功能 2023-03-05
- C语言 structural body结构体详解用法 2022-12-06
- C++中的atoi 函数简介 2023-01-05
- C语言基础全局变量与局部变量教程详解 2022-12-31