數據結構---隊列的實現

在此以前,已經瞭解過順序表和鏈表了,那麼如今要了解的棧和隊列,從本質上來講是基於上述倆個的,棧講究「」後進先出」,而隊列與之不一樣,要求「先進先出」,對於棧來講,根據規則,咱們瞭解到,棧的「入棧」即爲「尾插」,棧的出棧也要找到「尾數據」,考慮到實用性,咱們的「棧「是基於順序表完成的。這裏就不細細展開了,而對於本次要講的「隊列」,根據使用規則,會發現,入隊列相似「尾插」,出隊列是「首」,所以,爲了效率而言,「隊列」會和單鏈表(此單鏈表具備尾指針,有尾指針彌補「尾插」效率)聯繫起來
下面咱們來完成一個簡單但通用的「隊列」
1.首先呢,爲了方便操做,咱們創建一個本身的頭文件·,(這個頭文件後面會有引用),命名爲 queue.h,顧名思義;node

#pragma once
#include <stdlib.h>
#include <stdio.h>

typedef int QDataType;

typedef struct QNode//建立一個結構體來放須要用到的Node
{
    struct QNode* _next;//本身的指針
    QDataType _data;
}QNode;

typedef struct Queue
{
    QNode* _front;//首
    QNode* _rear;/尾
    QNode* _size;//此處size的建立便於後面檢查隊列滿與空
}Queue;
void queueInit(Queue* q);//初始化一個隊列
QNode* creatNode(QDataType data);//本身想使用的數據
void queuePush(Queue* q, QDataType data);//入隊列
void queuePop(Queue* q);//出隊列
QDataType queueFront(Queue* q)//獲取頭;
QDataType queueBack(Queue* q);//獲取尾
int queueSize(Queue* q);//多大
int queueEmpty(Queue* q);//判空
void queueDestory(Queue* q);//銷燬
2,這裏是咱們完成所須要的的函數的主要完成區域,我命名爲 Queue.c,在這裏完成函數,爲test引用作準備;
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"

void queueInit(Queue* q)
{
    q->_front = q->_rear = NULL;
    q->_size = 0;

}
QNode* creatNode(QDataType data)
{
    QNode* node = (QNode*)malloc(sizeof(QNode));
    node->_data = data;
    node->_next = NULL;
    return node;
}
void queuePush(Queue* q,QDataType data)
{
    QNode* node = creatNode(data);
    if (q->_front == NULL)
        q->_front = q->_rear = node;
    else
    {
        q->_rear->_next = node;
        q->_rear = node;
        ++q->_size;
    }
}
void queuePop(Queue* q)
{
    /*if (q->_front == NULL)
        return;
    if (q->_front == q->_rear)
    {
        q->_front =  q ->_rear = NULL;
    }
    else{
        QNode* next = q->_front;
        free(q->_front);
        q->_front = next;
    }*/
    if (q->_front)
    {
        QNode* next = q->_front->_next;
        free(q->_front);
        q->_front = next;
        if (q->_front == NULL)
            q->_rear = NULL;
        --q->_size;
    }
}
QDataType queueFront(Queue* q)
{
    /*if (q->_front == NULL)
        return "NULL";*/
    return q->_front->_data;

}
QDataType queueBack(Queue* q)
{
    return q->_rear->_data;
}
int queueSize(Queue* q)
{
    return q->_size;
}
int queueEmpty(Queue* q)
{
    if (q->_front == NULL)
        return 1;
    return 0;
}
void queueDestory(Queue* q)
{
    QNode* cur = q->_front;
    while (cur)
    {
        QNode* next = cur->_next;
        free(cur);
        cur = next;
    }
    q->_front = q->_rear = NULL;
    q->_size = 0;
}

3,這裏是咱們本身的操做區域哈哈,經過測試函數test來檢測你寫函數是否可用,這裏我只展現部分,其他的操做能夠本身按照需求加上去;ide

#define _CRT_SECURE_NO_WARNINGS 1

#include "queue.h"

void test1()
{
    Queue q;
    queueInit(&q);
    queuePush(&q, 1);//接口處傳&q,傳的是已經建立好的隊列,數字即爲data,
    queuePush(&q, 2);
    queuePush(&q, 3);
    queuePush(&q, 4);
    queuePop(&q);
    queuePop(&q);
    queuePop(&q);
    queuePop(&q);

}

int main()
{
    test1();
    return 0;
}
相關文章
相關標籤/搜索