提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、循环队列是什么?
示例:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表,在插入和删除操作时不需要移动数据,这样解决了移动数据的时间损耗,时间复杂度由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),但是它还存在一个问题,就是面临着数组可能会溢出的问题。
所以还需要研究一下不需要担心队列长度的链式存储结构。