数据结构之队列

2017-04-11  本文已影响47人  dongwenbo
队列

队列:受限制的线性表,先进先出

队列可以用顺序存储,也可以用链式存储,顺序存储一般指数组,链式就是链表

用数组存储有很多缺点:
1、出队入队都要移动整个队列
2、如果不移动整个队列,只移动队首指针,就会造成盲区
3、如果不想出现盲区,需要使队列变为环形队列,复杂化了(可以尝试一下)

暂时使用链式存储来实现队列

C
.h

#ifndef Queue_h
#define Queue_h

#include <stdio.h>
#include <stdbool.h>

typedef int Item;

//队列的容量
#define MAXQUEUE 10

//结点定义
typedef struct node{
    Item item;
    struct node *next;
}Node;

//queue的定义
typedef struct queue{
    Node *front;//队首指针
    Node *rear;//队尾指针
    int items;//当前队中个数
}Queue;

//初始化
void InitializeQueue(Queue *pq);

//判断队满
bool QueueIsFull(const Queue *pq);

//判断队空
bool QueueIsEmpty(const Queue *pq);

//判断队中的个数
int QueueItemCount(const Queue *pq);

//入队
bool EnQueue(Item item,Queue *pq);

//出队
bool DeQueue(Item *item,Queue *pq);

//置空队列
void EmptyTheQueue(Queue *pq);

#endif /* Queue_h */

.c

#include "Queue.h"
#include <stdlib.h>

//初始化
void InitializeQueue(Queue *pq){
    pq->front = NULL;
    pq->rear = NULL;
    pq->items = 0;
}
//判断队满
bool QueueIsFull(const Queue *pq){
    return pq->items == MAXQUEUE;
}

//判断队空
bool QueueIsEmpty(const Queue *pq){
    return pq->items == 0;
}

//判断队中的个数
int QueueItemCount(const Queue *pq){
    return pq->items;
}

//入队
bool EnQueue(Item item,Queue *pq){
    Node *node = (Node *)malloc(sizeof(Node));
    if (QueueIsFull(pq) || node == NULL) {
        return false;
    }
    node->item = item;
    node->next = NULL;
    if (QueueIsEmpty(pq)) {
        pq->front = node;
    }else{
        pq->rear->next = node;
    }
    pq->rear = node;
    pq->items++;
    return true;
}

//出队
bool DeQueue(Item *item,Queue *pq){
    if (QueueIsEmpty(pq)) {
        return false;
    }
    item = &(pq->front->item);
    Node *waitFreeNode = pq->front;
    pq->front = waitFreeNode->next;
    free(waitFreeNode);
    pq->items--;
    if(QueueIsEmpty(pq)){
        
    }
    return true;
}

//置空队列
void EmptyTheQueue(Queue *pq){
    while (!QueueIsEmpty(pq)) {
        DeQueue(NULL, pq);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读