循环队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、循环队列是什么?

示例:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表,在插入和删除操作时不需要移动数据,这样解决了移动数据的时间损耗,时间复杂度由O(n)变成了O(1); 我们把头尾相接的顺序存储结构称为循环队列。

二、C语言实现

#include <stdio.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 20
typedef int status;
typedef int QElemType;
typedef struct sqQueue{
	QElemType data[MAXSIZE];
	int front;
	int rear;
}sqQueue;

status InitQueue(sqQueue *q){
	q->front = 0;
	q->rear = 0;
	return OK; 
}

int QueueLength(sqQueue q){
	return (q.rear-q.front+MAXSIZE)%MAXSIZE;
}

status EnQueue(sqQueue *q, QElemType e){
	if ((q->rear+1)%MAXSIZE == q->front){
		return ERROR;//排除队列已满的情况 
	} 
	q->data[q->rear] = e;//把新元素e放到队列尾部 
	q->rear = (q->rear+1)%MAXSIZE;//把尾部指针向后移一位 
	return OK;
}

status DeQueue(sqQueue *q, QElemType *e){
	if (q->front == q->rear){
		return ERROR;//排除队列为空的情况 
	} 
	*e = q->data[q->front];
	q->front = (q->front+1)%MAXSIZE;//把头指针向后移动一位 
	return OK;
}

int main(int argc, char const *argv[]){
	sqQueue q;
	InitQueue(&q);
	int sql = QueueLength(q);
	printf("队列的长度为:%d\n", QueueLength(q));
	printf("向队列中加入数据元素1/20/31/42/56/78/99\n");
	EnQueue(&q, 1);
	EnQueue(&q, 20);
	EnQueue(&q, 31);
	EnQueue(&q, 42);
	EnQueue(&q, 56);
	EnQueue(&q, 78);
	EnQueue(&q, 99);
	printf("队列的长度为:%d\n", QueueLength(q));
	printf("消耗掉一个元素1\n");
	int e;
	DeQueue(&q, &e);
	printf("消耗掉的元素为%d\n", e);
	printf("队列的长度为:%d\n", QueueLength(q));
	return 0;
}


验证结果
在这里插入图片描述

三、python实现

# -*-coding:utf-8-*-


class SqQueue:
    def __init__(self, MAXSIZE):
        self.MAXSIZE = MAXSIZE
        self.data = [None]*self.MAXSIZE
        self.front = 0
        self.rear = 0

    def qLength(self):
        return (self.rear - self.front + self.MAXSIZE) % self.MAXSIZE

    def EnQueue(self, e):
        if (self.rear+1) % self.MAXSIZE == self.front:
            return "SqQueue is full."
        self.data[self.rear] = e
        self.rear = (self.rear+1)%self.MAXSIZE

    def DeQueue(self):
        if self.front == self.rear:
            return "SqQueue is empty."
        e = self.data[self.front]
        self.front = (self.front+1) % self.MAXSIZE
        return e


if __name__ == '__main__':
    s = SqQueue(20)
    print("长度为:", s.qLength())
    print("加入队列1/21/32/45/100")
    s.EnQueue(1)
    s.EnQueue(21)
    s.EnQueue(32)
    s.EnQueue(45)
    s.EnQueue(100)
    print("长度为:", s.qLength())
    print("出队列%d" % s.DeQueue())
    print("长度为:", s.qLength())



运行结果:
在这里插入图片描述

四、总结

循环队列的时间复杂度为O(1),但是它还存在一个问题,就是面临着数组可能会溢出的问题。
所以还需要研究一下不需要担心队列长度的链式存储结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你抱着的是只熊

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值