循环队列操作

  不是只有排序,二叉树才叫数据结构,面试栽在基本的数组和队列,链表,栈的有的是!!!本文对循环队列的重要操作作出总结。注:为了避免队列空和满两个状态混淆,
采用空闲一个位置的方式,即N个元素空间的循环队列最多只能存放N-1个有效元素。这也是大多数教材的做法。
1) 循环队列初始化:front=rear=0;
2)入队操作:rear=(rear+1)%size;
3)出队操作:front=(front+1)%size;
4)判断是否为空队列:front==rear;
5)判断队列是否已满:front=(rear+1)%size;
6)遍历队列各元素。

 

 #include <stdio.h>
 #include <stdlib.h>
 #include <malloc.h>
 #include <stdbool.h>   //注意使用布尔类型时,需要引入此头文件
 
 /*******************************************************************************************************************
 定义循环队列的结构体。注:循环队列是在数组的基础上实现的,所以需要一个指向首元素的指针,另外头和尾用int来表示相对偏移量即可。 
 ********************************************************************************************************************/
 typedef struct Queue
 {
     int * qBase;
     int front;
     int rear;
 }QUEUE;
 
 void initQueue(QUEUE *pq);
 void enQueue(QUEUE *pq , int value);
 bool isemptyQueue(QUEUE *pq);
 bool is_fullQueue(QUEUE *pq);
 void deQueue(QUEUE *pq , int *value);
 void traverseQueue( QUEUE *pq);
 
 /***************************************** 主函数测试入口 ********************************************/
 int main(){
     int val;
     QUEUE queue = {NULL,0,0} ;
     initQueue(&queue);
     enQueue(&queue,4);
     enQueue(&queue,5);
     enQueue(&queue,6);
     enQueue(&queue,7);
     enQueue(&queue,72);
     enQueue(&queue,42); 
 
     traverseQueue(&queue);
     deQueue(&queue , &val);
     deQueue(&queue , &val);
 
     traverseQueue(&queue);
     enQueue(&queue,55);
     enQueue(&queue,65);
     traverseQueue(&queue);
 
     return 0;
 }
 /**************************************初始化一个空的循环队列 ******************************************/
 void initQueue(QUEUE *pq){
     pq->qBase = (int *)malloc(sizeof(int)*6);
     if(pq->qBase == NULL){
         printf("内存分配失败!\n");
         exit(-1);
     }
     pq->front = pq->rear = 0; 
 }
 /***************插入一个新元素  注:插入前需要先判断该队列是否已满,避免覆盖有效数据******************/
 
 void enQueue(QUEUE *pq , int value){
 
     if(is_fullQueue(pq)){
         printf("循环队列已满,拒绝插入%d!\n",value);
      }
    else{
         pq->qBase[pq->rear] = value;
         pq->rear = (pq->rear + 1)%6 ;
         printf("\n %d 入队 \n" , value);
      }
 }
 
 /**************  删除一个元素,并通过指针返回该数  注:删除前要判断该队列是否为空。*******************/
 
  void deQueue(QUEUE *pq , int *value){
      if(isemptyQueue(pq)){
        printf("循环队列已空!");
     }
   else{
         *value = pq->qBase[pq->front];
         printf("\n %d 出队 \n",*value);
         pq->front = (pq->front + 1)%6 ;
      }
   }
  /************************************     判断循环队列是否为空 ************************************/
 bool isemptyQueue(QUEUE *pq){
     if(pq->front == pq->rear){
         return true;
     }
     else
         return false;
 }
 
 /************************************    判断循环队列是否已满 ************************************/
 bool is_fullQueue(QUEUE *pq){
     if((pq->rear +1)%6 == pq->front){
         return true;
     }else
         return false;
 }
 
 /*************************************     遍历循环队列中的各元素 *************************************/
 void traverseQueue( QUEUE *pq){
     if(isemptyQueue(pq)){
         printf("循环队列为空!\n");
         exit(0);
     }
     printf("当前循环队列 :\n");
     printf("front是%d,rear是%d :\n",pq->front,pq->rear);
  
     int tail = pq->front ;
     while(tail != pq->rear){
         printf(" %d ",pq->qBase[tail]);
         tail = (tail + 1)%6; 
     }
 }
  

  

转载于:https://www.cnblogs.com/zhaoyl/archive/2012/09/20/2695136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值