数据结构 循环队列的基本操作 C语言

本文详细介绍了一种基于数组的循环队列数据结构的实现方法,包括初始化、判断空满状态、元素入队与出队、获取队头元素、清空及销毁队列等核心功能。通过具体代码示例展示了如何在C语言中有效管理和操作循环队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<assert.h>
#include<stdio.h>
#include<stdlib.h>

#define size 10

typedef int ElemType;
typedef struct SqCycleQueue
{
 ElemType *space;
 int head;
 int tail;
 int queuesize;
}SqQue,*SqQuePtr;

static int Full(SqQuePtr sq)//判满
{
 if((sq->tail +1)%sq->queuesize ==sq->head ) return true;
 return false;
}

static int AppendSpace(SqQuePtr sq)//队满,申请空间 
{
 int i,j;
 if(sq->queuesize ==0)
 {
  sq->queuesize =size;
 }
 ElemType *s=(ElemType *)malloc(sizeof(ElemType)*sq->queuesize *2);
 assert(s!=NULL);
 if(s==NULL) return false;
 //挪数据
 for(i=sq->head ,j=0;i!=sq->tail ;i=i+1,j++)
 {
  s[j]=sq->space [i];
 }
 sq->head =0;
 sq->tail =sq->queuesize -1;
 sq->queuesize *=2;
 free(sq->space );
 sq->space =s;
 return true;
}

int Empty_SqQueue(SqQuePtr sq)//判空
{
 assert(sq!=NULL);
 if(sq==NULL) exit(0);

 if(sq->head ==sq->tail ) return true;
 return false;
}

int Init_SqQueue(SqQuePtr sq)
{
 assert(sq!=NULL);
 if(sq==NULL) exit(0);

 sq->space =(ElemType *)malloc(size * sizeof(ElemType));
 if(sq->space ==NULL) exit(0);

 sq->head =sq->tail =0;
 sq->queuesize =size;
 return true;
}

int Push_SqQueue(SqQuePtr sq,ElemType val)//入队
{
 assert(sq!=NULL);
 if(sq==NULL) exit(0);

 if(Full(sq)&&!AppendSpace (sq))//队满 
 {
  return false;
 }
 sq->space[sq->tail]=val;
 sq->tail =(sq->tail +1)%size;//重设队尾指针
 return true;
}

int Pop_SqQueue(SqQuePtr sq)//出队
{
 assert(sq!=NULL);
 if(sq==NULL) exit(0);

 if(Empty_SqQueue (sq))
 {
  return false;
 }
 sq->head =(sq->head +1)%size;
 return true;
}

ElemType GetHead_SqQueue(SqQuePtr sq)//得到队头元素
{
 assert(sq!=NULL);
 if(sq==NULL) exit(0);
 if(Empty_SqQueue (sq))
 {
  return false;
 }
 return sq->space [sq->head ];
}

void Clear_SqQueue(SqQuePtr sq )//清空
{
 assert(sq!=NULL);
 if(sq==NULL)
 {
  printf("%s:%d :: stack is null, so process will over\n", __FILE__, __LINE__);
  exit(0);
 }
 sq->tail =sq->head =0;
}

void Destroy_SqQueue(SqQuePtr sq)//销毁
{
 assert(sq!=NULL);
 if(sq==NULL)
 {
  printf("%s:%d :: stack is null, so process will over\n", __FILE__, __LINE__);
  exit(0);
 }
 free(sq->space );
 sq->space =NULL;
 sq->queuesize =sq->tail =0;
}

void Show(SqQuePtr sq)//打印队中元素
{
 assert(sq!=NULL);
 if(sq==NULL) exit(0);
 for(int i=sq->head;i<sq->tail ;i++)
 {
  printf("%d ",sq->space [i]);
 }
 printf("\n");
}


int main()
{
 SqQue sq;
 Init_SqQueue(&sq);
 for(int i=1;i<9;i++)
 {
  Push_SqQueue(&sq,i);
 }
 Show (&sq);
 Pop_SqQueue (&sq);
 Show (&sq);
 printf("%d\n",GetHead_SqQueue (&sq));
 Clear_SqQueue (&sq);
 Show (&sq);
 Destroy_SqQueue(&sq);
 Show (&sq);
 return 0;
}

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值