队列
特点:先进先出
这里主要讲下静态线式的实现,由于普通队列会导致空间浪费,所以主要讲循环队列。
其中:由于特点是先进先出,所以需要两个可以动的指针分别来表示进(rear)和出(front)。
当front == rear时,表示空。
表示满的方法则比较特别,因为两个动态指针就很难表示满了,所以这里少用了一个存储空间,也就是数组的最后一个存数空间不用,当 (rear+1)%maxsize = front 时,队列满。(这实际上就是求余数找到位置,两个相邻即可)如下图所示
这里利用图中数据,根据上面公式就是 (0+1)% 6 = 1,所以判满。
代码如下:(C++实现)
myqueue.h
#include"stdio.h"
#include"stdlib.h"
struct Queue
{
char*_space; //本次采用char类型
int _len;
int _rear; //压入用
int _front; //弹出用
};
void initQueue(Queue*q, int size);
bool isQueueFull(Queue*q);
bool isQueueEmpty(Queue*q);
void enQueue(Queue*q,char ch);
char deQueue(Queue*q);
void resetQueue(Queue*q);
void destroyQueue(Queue*q);
myqueue.cpp
#include"myqueue.h"
//循环队列实现
void initQueue(Queue*q,int size)
{
q->_len=size;
q->_space=(char*)malloc(sizeof(char)*q->_len);
q->_rear=q->_front=0;
}
bool isQueueFull(Queue*q)
{
return (q->_rear+1)%q->_len==q->_front;
}
bool isQueueEmpty(Queue*q)
{
return q->_front==q->_rear;
}
void enQueue(Queue*q,char ch) //往里压元素
{
q->_space[q->_rear]=ch;
q->_rear = ++ q->_rear % q->_len;//rear++后求余,主要是为了在最后一位能够移到第0位
}
char deQueue(Queue*q) //弹出
{
char ch= q->_space[q->_front];
q->_front = ++ q->_front % q->_len;//与上面同理
return ch;
}
void resetQueue(Queue*q) //复位
{
q->_front=q->_rear;
}
void destroyQueue(Queue*q) //销毁
{
free(q->_space);
}
main函数
#include <iostream>
#include"myqueue.h"
using namespace std;
int main()
{
Queue q;
initQueue(&q,26);
for(char ch='A';ch<='Z';ch++)
{
if(!isQueueFull(&q))
enQueue(&q,ch);
}
while(!isQueueEmpty(&q))
printf("%c ",deQueue(&q)); //由于需要牺牲一个存储单元来判满,所以只有25个
return 0; //即(rear+1)%maxsize = front的时候
}