先進(jìn)先出——隊(duì)列(Queue)

隊(duì)列的抽象數(shù)據(jù)類型描述:

  • 類型名稱:隊(duì)列(Queue)
  • 數(shù)據(jù)對(duì)象集: 一個(gè)用 0 個(gè)或多個(gè)元素的又窮線性表。
  • 操作集:長(zhǎng)度為 max_size 的隊(duì)列 QQueue,隊(duì)列元素 itemElementType。
  1. Queue creat_queue(int max_size): 生成長(zhǎng)度為 max_size 的空隊(duì)列;
  2. int is_full_q(queue q, int max_size): 判斷隊(duì)列 Q 是否已滿;
  3. void add_q(queue q, element_type item): 將元素 item 插入隊(duì)列 Q 中;
  4. int is_empty(queue q): 判斷隊(duì)列 Q 是否為空;
  5. element_type delete_q(queue q):將隊(duì)列元素從隊(duì)列中刪除并返回。

隊(duì)列的順序存儲(chǔ)實(shí)現(xiàn):

隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)通常由一個(gè)一維數(shù)組和一個(gè)記錄隊(duì)列頭元素位置的變量 front 以及一個(gè)記錄隊(duì)列尾元素位置的變量 rear 組成。

純C語(yǔ)言實(shí)現(xiàn):

// 隊(duì)列(Queue)
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 10
#define elem_type int
#define Position int
#define bool int
#define True 1
#define Flase 0
#define ERROR -1    // 錯(cuò)誤標(biāo)識(shí)

typedef struct {
    elem_type data[MAXSIZE];
    Position front; // 出隊(duì)
    Position rear;  // 入隊(duì)
    int len;
} Queue;

// 初始化
Queue* create_queue(void)
{
    Queue* Q = (Queue*)malloc(sizeof(Queue));
    Q->front = 0;
    Q->rear = -1;
    Q->len = 0;
    
    return Q;
}

// 隊(duì)列是否已滿
bool is_full(Queue* Q)
{
    bool n = Flase;
    if (Q->len == MAXSIZE){
        n = True;
    }
    
    return n;
}

// 入隊(duì)
bool add_q(Queue* Q, elem_type x)
{
    bool n = Flase;

    if (is_full(Q) == 0){
                // 用取余實(shí)現(xiàn)循環(huán)隊(duì)列
        Q->rear = (Q->rear + 1) % MAXSIZE;
        Q->data[Q->rear] = x;
        Q->len++;
        n = True;
    }
    
    return n;
}

// 隊(duì)列是否為空
bool is_empty(Queue* Q)
{
    bool n = Flase;
    if (Q->len == 0){
        n = True;
    }
    
    return n;
}

// 出隊(duì)
elem_type delete_q(Queue* Q)
{
    Position idx;
    if (is_empty(Q) == 0){
        idx = Q->front;
        Q->front = (Q->front + 1) % MAXSIZE;    // 更新出隊(duì)指針
        Q->len--;
        
        return Q->data[idx];
    } else {
        return ERROR;
    }
}

// 輸出隊(duì)列元素
void print(Queue* Q)
{
    int i;
    int n;
    for (i=0; i<Q->len; i++){
        n = (Q->front + i) % MAXSIZE;
        printf("%d\t", Q->data[n]);
    }
    printf("\n");
}

int main(void)
{
    Queue* Q = NULL;
    Q = create_queue();
    // 才創(chuàng)建的隊(duì)列應(yīng)為空
    if (is_empty(Q)){
        printf("隊(duì)列為空\(chéng)n");
    }
    int i = 0;
    // 入隊(duì) 0 1 2 3 4
    while (i<5){
        add_q(Q, i++);
    }
    // 出隊(duì) 0
    delete_q(Q);
    // 輸出 1 2 3 4
    print(Q);
    printf("Q->front = %d\tQ->rear = %d\tQ->len = %d", Q->front, Q->rear, Q->len);
    
    return 0;
}
IMG_20170629_225417.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,916評(píng)論 0 33
  • 教程一:視頻截圖(Tutorial 01: Making Screencaps) 首先我們需要了解視頻文件的一些基...
    90后的思維閱讀 4,988評(píng)論 0 3
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別? C沒(méi)有Protection行為...
    阿面a閱讀 7,891評(píng)論 0 10
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
    龍貓小爺閱讀 4,451評(píng)論 0 16

友情鏈接更多精彩內(nèi)容