美文网首页
数组实现循环队列

数组实现循环队列

作者: traxes | 来源:发表于2018-05-09 00:30 被阅读24次

循环队列作为一种常用的数据结构,它使头尾指针能够灵活的在容器头尾跳跃,实现循环存取的结构。线性队列,在不移动元素的情况下,随着数据的不断读写,会出现假上溢的情况(当尾部指针已经到了容器底部,线性队列就无法插入了,尽管存在已出队列的可以空间,),导致已出队列的可用空间无法再被利用。另外循环队列很适合作为缓存的处理。

//
//  CycleQueue.m
//  CycleQueue
//
//  Created by zengbailiang on 2018/5/8.
//  Copyright © 2018年 zengbailiang. All rights reserved.
//  循环队列

#import "CycleQueue.h"

#define CYCLE_QUEUE_MAX_SIZE 10
#define CYCLE_QUEUE_ELEMENT int

typedef struct kSCycleQueue
{
    CYCLE_QUEUE_ELEMENT data[CYCLE_QUEUE_MAX_SIZE];
    int fornt ,rear;
}*SCycleQueue;

@implementation CycleQueue

int queueInit(SCycleQueue *queue)
{
    if ((*queue) == NULL) {
        (*queue) = (SCycleQueue)malloc(sizeof(struct kSCycleQueue));
        //初始化队列头和队列尾部,队列尾初始化为-1是为了添加原始的时候统一操作为后移
        (*queue)->fornt = 0;
        (*queue)->rear = -1;
    }
    else
    {
        return -1;
    }
    return 1;
}

bool canAdd(SCycleQueue *queue)
{
    if((*queue) == NULL
       ||(*queue)->fornt + (*queue) ->rear + 1 == CYCLE_QUEUE_MAX_SIZE
       ||((*queue)->rear != -1 &&  (*queue)->rear + 1 == (*queue)->fornt))
    {
        return false;
    }
    else
    {
        return true;
    }
}

int add(SCycleQueue *queue,CYCLE_QUEUE_ELEMENT e)
{
    if (canAdd(queue)) {
        //如果已经是在最后一个原始,那么跳到第0个原始添加,实现循环
        if ((*queue) -> rear == CYCLE_QUEUE_MAX_SIZE - 1) {
            (*queue) -> rear = 0;
        }
        else
        {
            //非最后一个元素后移即可
            (*queue) -> rear += 1;
        }
        //队尾添加元素
        (*queue) ->data[(*queue) ->rear] = e;
        return 1;
    }
    else
    {
        return 0;
    }
    
}

int delete(SCycleQueue *queue,CYCLE_QUEUE_ELEMENT *e)
{
    if ((*queue) == NULL) {
        return  -1;
    }
    //如果rear不等于-1就代表存在元素
    else if((*queue)->fornt == 0 && (*queue)->rear == -1)
    {
        return 0;
    }
    else
    {
        (*e) = (*queue)->data[(*queue)->fornt];
        (*queue)->data[(*queue)->fornt] = -1;
        //如果 fornt == rear,代表最后一个元素了,这个时候把标记复位用于上面的判断。
        if ((*queue)->fornt == (*queue)->rear) {
            (*queue)->fornt = 0;
            (*queue)->rear = -1;
        }
        else if((*queue)->fornt == CYCLE_QUEUE_MAX_SIZE - 1)
        {
            //如果是最后一个元素出队列,那么队列头跳到容器第一个元素实现循环出队列
            (*queue)->fornt = 0;
        }
        else
        {
            (*queue)->fornt += 1;
        }
      return 1;
    }
}

+ (void)testt
{
    test();
    test1();
    test2();
}

void test()
{
    SCycleQueue queue;
    queueInit(&queue);
    add(&queue, 0);
    add(&queue, 1);
    add(&queue, 2);
    add(&queue, 3);
    add(&queue, 4);
    add(&queue, 5);
    add(&queue, 6);
    add(&queue, 7);
    add(&queue, 8);
    add(&queue, 9);//加满
    CYCLE_QUEUE_ELEMENT e;
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    add(&queue, 10);//容器底部已满,循环到头部开始添加
    add(&queue, 11);
    add(&queue, 12);
    add(&queue, 13);
    add(&queue, 14);
}
void test1()
{
    SCycleQueue queue;
    queueInit(&queue);
    add(&queue, 0);
    add(&queue, 1);
    add(&queue, 2);
    add(&queue, 3);
    add(&queue, 4);
    add(&queue, 5);
    add(&queue, 6);
    add(&queue, 7);
    add(&queue, 8);
    add(&queue, 9);
    CYCLE_QUEUE_ELEMENT e;
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);//全部出队列,标记复位
    delete(&queue, &e);
    add(&queue, 6);
    add(&queue, 7);
    add(&queue, 8);
    add(&queue, 9);
}

void test2()
{
    SCycleQueue queue;
    queueInit(&queue);
    add(&queue, 0);
    add(&queue, 1);
    add(&queue, 2);
    add(&queue, 3);
    add(&queue, 4);
    add(&queue, 5);
    add(&queue, 6);
    add(&queue, 7);
    add(&queue, 8);
    add(&queue, 9);
    CYCLE_QUEUE_ELEMENT e;
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);//font = 5
    add(&queue, 15);
    add(&queue, 16);
    add(&queue, 11);
    add(&queue, 12);
    add(&queue, 13);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);//循环到容器头出队列
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
    delete(&queue, &e);
}

@end

相关文章

  • 1.数组队列

    数组实现单队列 数组实现循环队列

  • 用数组实现循环队列

    用数组实现循环队列!

  • 队列

    基于数组的循环队列 Java实现 基于链表的队列实现 Java实现

  • 有关“队列”的总结

    队列 定义 分类 链式队列 (用链表实现) 静态队列 (用数组实现)图静态队列通常都必须是循环队列循环队列的讲解:...

  • Java数组实现循环队列

    Java数组实现循环队列 上一节(Java实现队列——顺序队列、链式队列)我们使用数组实现了顺序队列,但是在tai...

  • 数据结构——队列

    目录 1、什么是队列 2、队列的实现 2.1、基于简单循环数组的实现 2.1.1、为什么需要循环数组 2.1.2、...

  • C队列(数组循环队列、链表普通队列)

    一、数组循环队列 简述一下思想,该循环队列用数组实现,数组大小初始化为5(MaxSize),有头索引(front)...

  • Java基础面试题

    如何用数组实现队列? 用数组实现队列时要注意 溢出 现象,这时我们可以采用循环数组的方式来解决,即将数组收尾相接。...

  • 数组队列实现以及其出队问题

    基于动态数组的实现 用数组实现的队列,出队的时间复杂度是O(n),我们用循环队列解决

  • 数组实现循环队列

    循环队列作为一种常用的数据结构,它使头尾指针能够灵活的在容器头尾跳跃,实现循环存取的结构。线性队列,在不移动元素的...

网友评论

      本文标题:数组实现循环队列

      本文链接:https://www.haomeiwen.com/subject/udmgrftx.html