队列的定义:队列是一种特殊的线性表,只允许在表的头部(front处)进行删除操作,在表的尾部(rear处)进行插入操作的线性数据结构,这种结构就叫做队列。进行插入操作的一端称为队尾,进行删除操作的一端称为队头。
数组实现的队列会定义一段空间用于存放数据,另外一个front队头指针,一个rear队尾指针,队头指针指向队列的第一个元素,队尾指针指向队列最后一个元素的下一位。数据入队列时,队尾指针增加一位,出队列时,队头指针增加一位。
队列一般设计成循环队列,因为如果是非循环队列的话,进行数据插入、删除时,front、rear指针会一直增加,之前的位置就无法在使用到,会造成浪费。所以接下来我们就实现循环队列。
队列结构体:
typedef struct
{
ElemType *elem; //存放数据内容
int front; //队列头
int rear; //队列尾
int maxSize; //队列大小
}QUEUE_SQ;
非循环队列:
循环队列:
接口:
//初始化队列
void InitQueue(QUEUE_SQ &sq, int size);
//判断队列是否为空
bool isEmptyQueue(QUEUE_SQ sq);
//入队列
void PushQueue(QUEUE_SQ &sq, int elem);
//出队列
void PopQueue(QUEUE_SQ &sq);
//获取队列最前面数据
ElemType GetRearElem(QUEUE_SQ sq);
//获取队列元素个数
int GetNumElem(QUQUE_SQ sq);
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
using std::cout;
using std::endl;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int front;
int rear;
int maxSize;
}QUEUE_SQ;
//初始化队列
void InitQueue(QUEUE_SQ &sq, int size)
{
sq.elem = (ElemType *)malloc(size * sizeof(ElemType));
sq.front = 0;
sq.rear = 0;
sq.maxSize = size;
}
//判断队列是否为空
bool isEmptyQueue(QUEUE_SQ sq)
{
if(sq.front == sq.rear)
return true;
return false;
}
//判断队列是否满
bool isFullQueue(QUEUE_SQ sq)
{
if( (sq.rear + 1)%(sq.maxSize) == sq.front )
return true;
return false;
}
//入队列
void PushQueue(QUEUE_SQ &sq,int elem)
{
if(isFullQueue(sq))
{
cout<<"queue is full!"<<endl;
return;
}
cout<<"push queue:"<<elem<<endl;
sq.elem[sq.rear] = elem;
sq.rear = (sq.rear + 1)%(sq.maxSize);
}
//出队列
void PopQueue(QUEUE_SQ &sq)
{
if(isEmptyQueue(sq))
{
cout<<"queue is empty!"<<endl;
return;
}
ElemType e = sq.elem[sq.front];
cout<<"pop stack:"<<e<<endl;
sq.front = (sq.front + 1)%(sq.maxSize);
}
//获取队列元素个数
int GetNumElem(QUEUE_SQ sq)
{
if(isEmptyQueue(sq))
{
cout<<"queue is empty!"<<endl;
return 0;
}
int num = sq.rear - sq.front;
return num;
}
const int SIZE = 10;
int main()
{
QUEUE_SQ sq;
InitQueue(sq, SIZE);
PushQueue(sq, 10);
PushQueue(sq, 20);
PushQueue(sq, 30);
cout<<"num elem:"<<GetNumElem(sq)<<endl;
PopQueue(sq);
PopQueue(sq);
PopQueue(sq);
cout<<"num elem:"<<GetNumElem(sq)<<endl;
return 0;
}
打印结果:
push queue:10
push queue:20
push queue:30
num elem:3
pop stack:10
pop stack:20
pop stack:30
queue is empty!
num elem:0