算法与数据结构之七----顺序队列

本文介绍了一种使用顺序表实现队列的方法,详细讲解了队列的初始化、判断空队列和满队列、入队、出队及读取队首元素等功能,并提供了完整的C语言实现代码。

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

/****************************************************************
文件内容:队列之顺序队操作
版本V1.0
时间:2013-12-30
说明:队列也可以使用顺序表和链表来实现,本文主要讲顺利队列
1.为了防止假溢出,采用环形buf。环形buf 指针移到必需通过%来修正
2.在环形 buf中,为了区分是空队列还是满队列(因为这两种情况Rear指针都等于front),引入了num计数
3.队列就是先进先出的一个FIFO结构,在实际生活中最常见的模型,如先来先服务的排队
  共享内存的buf,生产者与消费者模型等
 ****************************************************************/ 
#include<stdio.h>
#include<stdlib.h>
//#define RELEASE_VERSION  //release版本开关
//#define TRIDiTION
/*inlude<malloc.h> stdlib.h 包含malloc.h*/
#ifdef RELEASE_VERSION
#define  Log 
#else
#define  Log  printf
#endif
#define MAX 15
/*为了提高程序的可移植性,千万不能使用裸露的数据类型*/
#ifndef UINT32 
typedef unsigned int UINT32 ;
#endif
#ifndef INT32 
typedef  int  INT32 ;
#endif
typedef struct Sequeue
{
INT32 data[MAX];
INT32 Front , Rear;
INT32 num;
}SeQueue ,* SQPointer;


/****************************************************************
函数功能:初始化顺序队列                       
输入参数:  无
返回值: 顺序的队列的标头指针 
说明:顺序队列是由顺序来实现,所有的操作方式都是跟顺序表一样,只是某些操作堆队列来说是
非法的。
作者:HFL 
时间:2013-12-30
 *****************************************************************/  
SQPointer Init_Sequeue()
{
SQPointer s = NULL;
s = (struct Sequeue * )malloc(sizeof (struct Sequeue));
if(NULL)
{
Log("malloc is failed\n");
}
else
{
Log( "malloc is sucessed \n");
}
s->Front = -1;
    s->Rear = -1;
s->num = 0 ;

return s;
}
/****************************************************************
函数功能:判断顺序队列是否为空队列                       
输入参数:  无
返回值: 顺序的队列的标头指针 
说明:顺序队列是由顺序来实现,所有的操作方式都是跟顺序表一样,只是某些操作堆队列来说是
非法的。
作者:HFL 
时间:2013-12-30
 *****************************************************************/ 
INT32 Is_Empty_Sequeue(SQPointer q)
{
  if (0 == q->num )
  {
 Log("sorry,the sequeue is NULL\n");
 return 0;
  }
  else
  {
    return 1;
  }
}
/****************************************************************
函数功能: 判断顺序队列是否已经满                       
输入参数:  无
返回值: 顺序的队列的标头指针 
说明:顺序队列是由顺序来实现,所有的操作方式都是跟顺序表一样,只是某些操作堆队列来说是
非法的。
作者:HFL 
时间:2013-12-30
 *****************************************************************/ 
INT32 Is_Full_Sequeue(SQPointer q)

  if ( q->num == MAX )
  {
 Log("sorry,the sequeue is FULL\n");
 return 0;
  }
  else
  {
    return 1;
  }
}


/****************************************************************
函数功能: 顺序队列入队列                      
输入参数:  无
返回值: 顺序的队列的标准指针
说明:顺序队列是由顺序来实现,所有的操作方式都是跟顺序表一样,只是某些操作堆队列来说是
非法的。
作者:HFL 
时间:2013-12-30
 *****************************************************************/ 
INT32 FIFO_IN_Sequeue(SQPointer q,INT32 X)
{
if(!Is_Full_Sequeue(q))
{
     return -1;
}

q->Rear = (q->Rear+1)%(MAX);
q->num++ ;
    q->data[q->Rear] = X;
Log("The INTO %ddata is %d\n",q->Rear,q->data[q->Rear]);
return 0;
}
/****************************************************************
函数功能: 顺序队列出队列                      
输入参数:  无
返回值: 顺序的队列的标准指针
说明:顺序队列是由顺序来实现,所有的操作方式都是跟顺序表一样,只是某些操作堆队列来说是
非法的。
作者:HFL 
时间:2013-12-30
 *****************************************************************/ 
INT32  FIFO_OUT_Sequeue(SQPointer q,INT32 *X )
{  

if(!Is_Empty_Sequeue(q))
{
*X  = 0 ;
     return -1;
}
q->Front = (q->Front+1)%(MAX);
    *X = q->data[q->Front];
// Log("The INTO %ddata is %d\n",q->Rear,q->data[q->Rear]);
    
q->num--;
return 0;
}


/****************************************************************
函数功能: 顺序队列读队列顶元素                      
输入参数:  无
返回值: 顺序的队列的标准指针
说明:顺序队列是由顺序来实现,所有的操作方式都是跟顺序表一样,只是某些操作堆队列来说是
非法的。
出队列会修改队列顶指针,而读队列顶元素,不需修改队列顶指针
作者:HFL 
时间:2013-12-30
 *****************************************************************/
INT32  Read_Sequeue(SQPointer q )
{  
INT32 temp;
if(!Is_Empty_Sequeue(q))
{
     return -1;
}
    temp = q->data[q->Front];
    return temp;

void main()

INT32 i = 0,Ret = -1;
INT32 X;
SeQueue * s = NULL;
    
    Log("*******************************\n");
Log("*                             *\n");
Log("*   Init Sequeue is start !   *\n");
Log("*                             *\n");
Log("*******************************\n");
s= Init_Sequeue();
if (!s)
{
Log( "Init_Sequeue is failed!\n");
}
else
{
Log( "Init_Sequeue is sucessed\n");
}
Log("*******************************\n");
Log("*                             *\n");
Log("*    Into Sequeue is start !   *\n");
Log("*                             *\n");
Log("*******************************\n");
for(i=0;i<15;i++)
{
FIFO_IN_Sequeue(s,i+1);
}
Log("*******************************\n");
Log("*                             *\n");
Log("*   Output Sequeue is start ! *\n");
Log("*                             *\n");
Log("*******************************\n");
for(i=0;i<7;i++)
{  
FIFO_OUT_Sequeue(s,&X);
Log("The OUTPUT data is %d\n",X);
}
    Log("*******************************\n");
Log("*                             *\n");
Log("*   Read Sequeue is start !   *\n");
Log("*                             *\n");
Log("*******************************\n");
Log("The OUTPUT data is %d\n",Read_Sequeue(s));
Log("*******************************\n");
Log("*                             *\n");
Log("*    Second Into Sequeue is start !   *\n");
Log("*                             *\n");
Log("*******************************\n");
for(i=0;i<7;i++)
{
FIFO_IN_Sequeue(s,i*2);
}
  Log("***********************************\n");
Log("*                                 *\n");
Log("*   Output all Sequeue is start ! *\n");
Log("*                                 *\n");
Log("***********************************\n");
for(i=0;i<15;i++)
{  
FIFO_OUT_Sequeue(s,&X);
Log("The OUTPUT data is %d\n",X);
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江海细流

如该文章对你有帮助,请支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值