队列(Queue) ——(一)静态线式实现

队列

特点:先进先出

这里主要讲下静态线式的实现,由于普通队列会导致空间浪费,所以主要讲循环队列。

其中:由于特点是先进先出,所以需要两个可以动的指针分别来表示进(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的时候
}

猜你喜欢

转载自blog.csdn.net/weixin_42513339/article/details/81264280