顺序队列(设计成环形队列)

来源:互联网 发布:网络考试系统软件 编辑:程序博客网 时间:2024/06/04 19:25


队列:先进先出


环形队列的时间复杂度:

(1)入队:O(1)


(2)出队:O(1)


1、头文件(queue.h)

#pragma once//顺序队列:设计成环形队列#define SIZE 10typedef struct Queue{int elem[SIZE];//数据int front;//队头指针:队列中第一个数据的下标int rear;//队尾指针:队尾数据的下一个数据下标即当前可以存放数据的下标}Queue,*PQueue;//初始化void InitQueue(PQueue pq);//入队bool Push(PQueue pq,int val);//出队bool Pop(PQueue pq,int *rtval);//判空bool IsEmpty(PQueue pq);//获得队头bool GetTop(PQueue pq,int *rtval);//摧毁void Destroy(PQueue pq);


2、源文件(queue.cpp)

#include <stdlib.h>#include <stdio.h>#include <assert.h>#include "queue.h"//初始化void InitQueue(PQueue pq){assert(pq != NULL);pq->front = 0;pq->rear = 0;}//判满:内部函数//浪费一个单元格用于区分满和空static bool IsFull(PQueue pq){return (pq->rear+1) % SIZE == pq->front;}//入队bool Push(PQueue pq,int val)//O(1){if(IsFull(pq)){return false;}pq->elem[pq->rear] = val;pq->rear = (pq->rear+1)%SIZE;return true;}//出队(获得队头并删除)bool Pop(PQueue pq,int *rtval)//O(1){assert(pq != NULL);if(IsEmpty(pq)){return false;}*rtval = pq->elem[pq->front];pq->front = (pq->front+1)%SIZE;return true;}//判空bool IsEmpty(PQueue pq){return pq->front == pq->rear;}//获得队头但不删除bool GetTop(PQueue pq,int *rtval){assert(pq != NULL);if(IsEmpty(pq)){return false;}*rtval = pq->elem[pq->front];return true;}//摧毁void Destroy(PQueue pq){pq->front = pq->rear;}


3、测试源文件(test.cpp)

#include <stdio.h>#include "queue.h"int main(){int i;Queue p;InitQueue(&p);for(i = 0; i < 10;i++){Push(&p,i);//入队}int tmp;while(!IsEmpty(&p)){Pop(&p,&tmp);//出队printf("%d\n",tmp);}return 0;}


上述程序的运行结果:


原创粉丝点击