首页 > 其他分享 >C语言 循环队列

C语言 循环队列

时间:2023-11-03 16:25:25浏览次数:30  
标签:fronts 队列 C语言 int Maxsize 循环 SqQuenue rear

什么是队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

什么是循环队列

在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置。指针从MaxSize-1增1变到0,可用取余运算rear%MaxSize和front%MaxSize来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。

使用循环队列虽然可以解决顺序队列中浪费内存的问题,但这里任然存在一个问题,就是对于循环队列而言,队空和队满的条件都是rear==front,导致两种情况无法区分。

解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 100
using namespace std;
 
typedef struct quenue{
    int data[Maxsize];
    int fronts;
    int rear;
}SqQuenue;
//初始化
int Init_SqQuenue(SqQuenue &S)
{
    S.fronts=S.rear=0;
}
//入队
bool EnQuenue(SqQuenue &Q,int x)
{
    if((Q.rear+1)%Maxsize==Q.fronts)
        return false;
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%Maxsize;
    return true;
}
//出队
bool DeQuenu(SqQuenue &Q,int &x)
{
    if(Q.rear==Q.fronts)
        return false;
    x=Q.data[Q.fronts];
    Q.fronts=(Q.fronts+1)%Maxsize;
    return true;
}
//打印
int show_SqQuenue(SqQuenue Q)
{
    for(int i=Q.fronts;i<Q.rear;i++)
    {
        printf("%d ",Q.data[i]);
    }
}
int main()
{
    SqQuenue Q;
    Init_SqQuenue(Q);
    EnQuenue(Q,1);
    EnQuenue(Q,2);
    EnQuenue(Q,3);
    show_SqQuenue(Q);
    int x;
    DeQuenu(Q,x);
    printf("%d\n",x);
    show_SqQuenue(Q);
    return 0;
}

 

标签:fronts,队列,C语言,int,Maxsize,循环,SqQuenue,rear
From: https://www.cnblogs.com/yuyanc/p/17807820.html

相关文章

  • GO语言使用redis stream队列demo
    GO语言使用redisstream队列demopackagemainimport( "context" "fmt" "github.com/go-redis/redis/v8" "time")varclient*redis.Clientvarctxcontext.Contextvarkey="my_streamKey"//keyvarmyCons......
  • C语言基础之基础的输入输出
    前言学一门编程语言,不能编写让用户输入数据然后输出处理后的数据的程序那么就等于没学,而在C语言中可以用printf()和scanf()函数进行输入和输出操作。这两个函数是内置的库函数,定义在stdio.h(头文件)中。printf()函数printf()函数用于输出操作。它将给定的语句打印到控制台......
  • C语言基础之第一个C程序
    前言在开始学习C语言的基础知识之前,我们需要学习如何编写、编译和运行第一个C程序。要编写第一个C程序,打开C控制台并编写以下代码,我这里直接使用vs2022进行代码的编写:#include<stdio.h>intmain(){ printf("Hello,World!"); return0;}运行效果如下:代码解......
  • C语言10进制转化为2进制
    #include<stdio.h>intmain(){ intx,i,flag=0x8000; scanf_s("%d",&x); for(i=0;i<16;i++){ if((flag&x)==0)printf("0"); elseprintf("1"); flag>>=1; } return0;}7,8,9行没怎么看懂,有......
  • C语言基础之理论概述
    C语言介绍C语言是一种高级程序设计语言,由贝尔实验室的DennisRitchie在1972年开发。C语言是结构化编程语言,支持变量、数据类型、运算符、表达式、流程控制语句和函数等基本程序设计元素。C语言广泛用于系统软件、应用程序、驱动程序和嵌入式系统开发等领域。C语言具有可移植性强......
  • Rabbitmq消息队列:Route路由模式简单应用
    一、生产者在发布订阅模式的代码基础上,进行一定的调整,将声明交换机的路由模式调整为direct路由模式。这个时候需要用到路由key,类似于给消息用来分类的标签。分别发送三条消息,发向GetOne、GetTwo和GetThree三个路由key://声明交换机(类型direct->路由模式)channel......
  • C语言小案例
    1.设计一个函数,使用以下无穷极数计算sinx的值,sinx=x/1!-(x^3)/3!+(x^5)/5!-(x^7)/7!+....。舍去的绝对值应小于m,m的值由用户指定。#include<stdio.h>#include<math.h>doublecomputeSin(doublex,doublem){doubleterm=x;//第一项为xdoublesinx=term;//初......
  • JavaScript for循环语句的特殊案例,用代码解决数学中的问题
    案例一:一百个和尚分一百个馒头,大和尚一人分三个,小和尚三人分一个,正好分完。问大、小和尚各几人?varnum=100;varpeople=100;varbig,small;for(big=0;big<=33;big++){small=people-big;if(big*3+small/3==num){d......
  • Rabbitmq消息队列:Publish/Subscribe模式简单应用
    一、生产者packagetest.publish;importcom.rabbitmq.client.Channel;importcom.rabbitmq.client.Connection;importutils.RabbitmqConUtil;publicclassGive{//定义交换机privatefinalstaticStringEXCHANGE="test-publish";publicstati......
  • 循环
    一.while循环(1)while循环的关键在于其会先进行条件是否满足的判断,如果条件为真,可进入循环,但若条件不满足,则跳过循环语句,执行循环的下一句(这也意味着while循环可语句可能一次也不会执行)注意:在特定程序中,带入特殊值确定情况是否满足(整百,整十,0,负数)二.for循环(1)for循环的格式:for(初......