美文网首页
数据结构与算法07——循环队列

数据结构与算法07——循环队列

作者: Foxhoundsun | 来源:发表于2020-04-15 03:25 被阅读0次

循环队列的特点:
所有队列的特点都是先进先出
**在循环队列中,由于入队时:尾指针向前驱赶头指针。出队时:头指针向前驱赶尾指针。无论当队空或队满时:front==rear,所以不能判断队空或者队满。这个时候我们可以空出一个元素空间,也就是最后一个元素空间不使用,这样样的话,队满时就是:(rear+1)%n==front。从而判断队空和队满
**

image.png

循环队列的操作

  • 循环队列的定义
#define OK 1
#define ERROR 0
#define ARR_SIZE 6
typedef int Status;

typedef struct Queue{
    int *QArr;//存放队列元素的数组
    int front;
    int rear;
}QUEUE;
  • 循环队列初始化
    新建队列,分配内存,头指针和尾指针置0;
Status InitQueue(QUEUE *q){
    q->QArr = (int *)malloc(sizeof(int) * ARR_SIZE);
    
    if (q->QArr != NULL) {
        q->front = q->rear = 0;
        return OK;
    }
    return ERROR;
}
  • 判断队列为空
    头指针和尾指针指向相同的地方时,队空。
Status IsEmptyQueue(QUEUE q){
    if (q.front == q.rear) {
        return OK;
    }
    return ERROR;
}
  • 判断队满
    队满的条件:(rear+1)%n==front
Status IsFullQueue(QUEUE q){
    if ((q.rear+1)%ARR_SIZE == q.front) {
        return OK;
    }
    return ERROR;
}
  • 获取对头元素
    获取对头元素就是获取先进的元素
Status GetTopValue(QUEUE q){
    if (IsEmptyQueue(q)) return ERROR;
    
    return q.QArr[q.front];
}
  • 获取队列的长度
int lengthOfQueue(QUEUE q){
    if (IsEmptyQueue(q)) return ERROR;
    
    return (q.rear - q.front + ARR_SIZE)%ARR_SIZE;
}
  • 清空队列
    头尾置空
Status ClearQueue(QUEUE *q){
    
    q->front = q->rear = 0;
    
    return OK;
}

  • 入队
    入队操作就是将数据放到内存中,但是要考虑放到那一块内存中。我们要做的是,保持头指针不动,尾指针向后移动一位
Status InQueue(QUEUE *q,int data){
    if (IsFullQueue(*q)) return ERROR;
    
    q->QArr[q->rear] = data;
    q->rear = (q->rear + 1)%ARR_SIZE;
    return OK;
}
  • 出队
    先进先出,出队操作是将先进来的元素移出。头指针向后偏移,尾指针不动
Status OutQueue(QUEUE *q,int *data){
    if (IsEmptyQueue(*q)) return ERROR;
    
    //出队元素
    *data = q->QArr[q->front];
    q->QArr[q->front] = 0;
    q->front = (q->front + 1)%ARR_SIZE;
    
    return OK;
}

遍历

void printQueue(QUEUE q){
    if (IsEmptyQueue(q)) return;
    
    printf("打印队列!\n");
    while (q.front != q.rear) {
        printf("%d  ",q.QArr[q.front]);
        
        q.front = (q.front + 1)%ARR_SIZE;
    }
    printf("\n");
}

相关文章

  • 数据结构与算法07——循环队列

    循环队列的特点:所有队列的特点都是先进先出**在循环队列中,由于入队时:尾指针向前驱赶头指针。出队时:头指针向前驱...

  • 数据结构与算法相关

    第二章 数据结构与算法相关 1.常用的数据结构有哪些? 数组、栈、队列、链表(单链表、双向链表、循环链表)、树、散...

  • 数据结构与算法 (队列实现篇)

    数据结构与算法 (队列实现篇) 在数据结构与算法中,队列(queue)是一种受限的线性储存结构,特殊之处在于它只允...

  • 数据结构与算法——队列之循环队列

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,在表的后端进行插入操作。插入操作的端称为队尾,...

  • 排序算法

    什么是算法 书籍推荐 《数据结构与算法分析》 表、栈和队列 树 散列(hash) 优先队列(堆) 排序 定义 问题...

  • leetcode622.设计循环队列

    题目链接 题解: 在我的文章数据结构之——队列与循环队列 中,有关于循环队列的设计,包括本题没有考虑过的resiz...

  • 数据结构与算法06——队列之循环队列

    队列 与栈不同,他就是现实中排队一样,讲究先来后到,即 先进先出。打个比方,你告诉朋友我们做地铁去西湖,你输入 "...

  • 集合相关数据结构与算法

    队列 栈数据结构 比较算法 Collections Collection与Collections的区别?Colle...

  • 数据结构与算法学习开篇

    数据结构与算法知识图谱 20个最常用的、最基础数据结构与算法 10个数据结构:数组、链表、栈、队列、散列表、二叉树...

  • 数据结构和算法(三)双向链表与双向循环链表的实现

    数据结构和算法(一)线性表实现 数据结构和算法(二)单向循环链表的创建插入删除实现 数据结构和算法(三)双向链表与...

网友评论

      本文标题:数据结构与算法07——循环队列

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