【数据结构】c语言如何实现循环队列


前言

在看接下来的文章之前大家知道必须知道两个问题。

问题一: ‘为什么静态队列都是循环队列?’

答:因为静态队列是基于数组实现的,若不使用循环队列,会导致已经删除的元素所使用的空间无法继续使用,造成空间浪费。

问题二:‘rear和 front分别表示什么?’
答:规定front指向第一个元素的位置,rear指向最后一个元素的下一个位置。

在这里插入图片描述

一、队列的初始化

思路分析

pBase指向队列的首元素,此数组长度为8

void init(QUEUE *pQ)   //初始化 
 {
    
    
 	pQ->pBase=(int*)malloc(sizeof(int)*8 );
	pQ->front=0;
	pQ->rear=0;
 } 
 

二、判满及入队

1.判满

思路分析

一般判满采用两种方法
1.多增加一个标识参数,用于表示元素的个数。
2.少放一个元素(例如此处我的数组长度为8,当我数组中含有7个元素的时候我的数组就满了) 此时的判定条件为(rear+1)%数组长度=front是队列为满。

此处我采用的第二种方法,也推荐大家使用第二种方法,因为第一种方法需要多维护一个参数。

int full_queue(QUEUE *pQ) //判断队列是否满 
  {
    
    
  	if((pQ->rear+1)%8==pQ->front)
  	{
    
    
  		return 1;
	}
	else
	{
    
    
		return 0;
	}
  }

2.入队

思路分析

先使用判满函数判断队列是否为满,若不是,则把新元素的值赋给rear所指的区域,rear向前移一位
rear=(rear+1)%数组长度

int en_queue(QUEUE *pQ, int val)//入队
 {
    
    
 	if(full_queue(pQ))
 	{
    
    
 		return 0;
	}
	else
	{
    
    
		pQ->pBase[pQ->rear]=val; 
		pQ->rear=(pQ->rear+1)%8;
        return 1;	
	}
  } 

三、判空及出队

1.判空

思路分析

若rear=front则队列为空。

int empty_queue(QUEUE * pQ) //判空 
{
    
    
	if(pQ->front==pQ->rear)
	{
    
    
		return 1;
	}
	else
	{
    
    
		return 0;
	}    
} 

2.出队

思路分析

先使用判空函数判断队列是否为空,若不是则向前移一位
front=(front+1)%数组长度

int de_queue (QUEUE *pQ,int *pVal)//出队 
{
    
    
	if(empty_queue(pQ))
	{
    
    
			return  0;
	}
	else
	{
    
      
			*pVal=pQ->pBase[pQ->front];
			pQ->front=(pQ->front+1 )%8;		
			return  1;
	}
}  

四、队列的遍历输出

思路分析

因为遍历是从头部输出所以先把front的值赋给一个参数,当参数等于rear时停止输出。

void traverse_(QUEUE *pQ) //遍历 
  {
    
    
  	int i= pQ->front;
  	while(i!=pQ->rear)
  	 	{
    
    
  	        printf("%d",pQ->pBase[i] );
  	        i=(i+1)%8;
  		}
  }

五、主函数

int main()
 {
    
      int val;
	QUEUE Q; 
	init(&Q);
	en_queue(&Q,1);   //入队 
	en_queue(&Q,2);
	en_queue(&Q,3);
	en_queue(&Q,4);
	en_queue(&Q,5);
	en_queue(&Q,8);
	en_queue(&Q,7);	
    //de_queue(&Q,&val);
    traverse_(&Q);      //入队后第一次遍历 
    printf("\n"); 
   if( de_queue(&Q,&val))      //出队 
   {
    
    
   	 printf("出队成功!\n",val);
   }
   else
   {
    
    
   	printf("出队失败!\n") ; 
   }
   traverse_(&Q);           //出队后再次遍历 
}
 

Guess you like

Origin blog.csdn.net/weixin_50302770/article/details/116795367