C/C++數據結構:隊列結構最全解析!帶你零基礎入門隊列結構

前言

上一章節針對於C語言棧結構作了解析,不清楚的能夠回顧一下。前端

本章節主要針對於C語言的基礎數據結構隊列作以解析。ios

數據結構之隊列

隊列是一種特殊的 線性表 ,特殊之處在於它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做,和棧同樣,隊列是一種操做受限制的線性表。進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲隊頭。編程

故隊列基本操做以下:後端

(1)建立隊列數組

(2)入隊微信

(3)出隊數據結構

(4)判斷隊列是否爲NULL函數

(5)獲取隊頭元素學習

數據結構之隊列分類

根據隊列實現方式與出隊方式,咱們能夠把棧分爲如下三種描述方式:測試

(1)原生數組隊列

(2)動態申請內存的數組描述(普通隊列和循環隊列)

(3)鏈式結構描述

優先隊列

原生數組描述隊列

數組描述棧,只不過多了先進先出的限制而已,它是靜態分配的,即便用前,它的內存就已經以數組的形式分配好了,因此在使用時,須要注意隊頭隊尾的標記。

原生數組描述隊列實現試題案例:逆序整數

動態數組描述隊列

動態申請內存的數組描述再也不採用上述實用性的方法了,而是經過封裝相關隊列函數去描述這種結構。這是寫數據結構的一種大體方法。

1.結構體定義與隊列的建立過程:

結構體定義:描述隊列的屬性:隊頭標記,隊尾標記,隊列空間

建立隊列其實就是建立結構體變量

具體代碼

ps:隊頭和隊尾頂標記初始值通常都是-1 ,爲了知足隊列標記和數組下標一致

2.入隊操做

注意: 咱們的實現是將最新的元素放在了數組的末尾, 那麼數組末尾的元素就是咱們的隊列隊尾元素,故可使用隊尾標記去計算隊列中的元素個數。而後每次入隊後,隊尾標記日後移動。

具體實現代碼:

3.出隊操做和獲取隊頭元素

注意: 出隊操做應該是將隊頭元素刪除,因爲數組實現的隊列沒法刪除,故只能把隊頭標記往隊尾移動,簡稱爲一種"僞刪除"。

具體實現代碼:

4.判斷棧是否爲空

用戶判斷棧中是否有元素,經過隊尾和隊頭標記去作便可

具體實現代碼:

動態申請內存的數組描述隊列測試代碼

ps:循環隊列是經過取餘造成的循環,這裏不過多介紹,有興趣的能夠看看相關資料。

鏈式隊列

鏈式隊列: 鏈表的尾插法便可

具體實現源碼獻上

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
  int data;
  struct Node* next;
}NODE,*LPNODE;

LPNODE createNode(int data)
{
  LPNODE newNode = (LPNODE)malloc(sizeof(NODE));
  newNode->data = data;
  newNode->next = NULL;
  return newNode;
}
typedef struct
{
  int queueSize;
  LPNODE frontNode;
  LPNODE tailNode;
}QUEUE,*LPQUEUE;
LPQUEUE createQueue()
{
  LPQUEUE queue = (LPQUEUE)malloc(sizeof(QUEUE));
  queue->queueSize = 0;
  queue->frontNode = NULL;
  queue->tailNode = NULL;
  return queue;
}
void push(LPQUEUE queue, int data)
{
  //無頭表頭鏈表的在封裝法
  LPNODE newNode = createNode(data);
  if (queue->queueSize == 0)
  {
    queue->frontNode = newNode;
    queue->tailNode = newNode;
  }
  else
  {
    //無表頭鏈表的表尾插入
    queue->tailNode->next = newNode;
    queue->tailNode = newNode;
  }
  queue->queueSize++;
}
//FILO  +FIFO
void pop(LPQUEUE queue)
{
  if (queue->queueSize != 0)
  {
    LPNODE nextNode = queue->frontNode->next;
    free(queue->frontNode); 
    queue->frontNode = nextNode;
    queue->queueSize--; 
  }
}
int front(LPQUEUE queue)
{
  return queue->frontNode->data;
}

int empty(LPQUEUE queue)
{
  return queue->queueSize==0;
}
int size(LPQUEUE queue)
{
  return queue->queueSize;
}

int main()
{
  LPQUEUE queue = createQueue();
  for (int i = 1; i <= 3; i++)
  {
    push(queue, i);
  }
  while (!empty(queue))
  {
    printf("%d\t", front(queue));
    pop(queue);
  }
  printf("\n");
  system("pause");
  return 0;
}

優先隊列:根據優先權去決定你出隊的元素,故數據中存在優先權衡量的值,相關實現代碼以下:

#include <iostream>
#define MaxQueueSize 100    //隊列的大小
//數據類型   數據自己  優先權
typedef int ElementType;  //定義數據類型地 別名
 
//數據 結構體
typedef struct 
{
  int priority;    //優先權---工做量
  ElementType element;//隊列中的元素
}DataType;
 
//隊列的結構體
typedef struct
{
  int size;
  //結構體的嵌套
  DataType Queue[MaxQueueSize];
}PriQueue;
//讀取文件做業---調度讀取
//隊列操做
//初始化---初始化基本成員
//size   Queue
void InitQueue(PriQueue *Q)
{
  Q->size = 0;
}
//判斷隊列是否爲空  NULL
//和它的初始化比較
int QueueEmpty(PriQueue *Q)
{
  // -> 指向運算符  C:結構體指針  C++: 類和結構體
  // :: 做用域限定符
  if (Q->size <= 0)
    return 0;   //標誌
  else
    return 1;  //不爲空
  //  return 0 函數結束
}
//入隊 文件操做
int Push(PriQueue *Q, DataType data)
{
  //入隊前判斷是否滿
  if (Q->size >= MaxQueueSize)
  {
    std::cout << "杯子已滿,沒法再倒水" << std::endl;
    return 0;
  }
  else
  {
    //Q->size=0;
    Q->Queue[Q->size] = data;
    //入隊了隊列長度就要增加
    Q->size++;
    return 1;
  }
 
}
//出隊
int Pop(PriQueue *Q, DataType *A)
{
  DataType min;    //最小的開始,排序
  int minIndex = 0;
  //短做業優先法
  //喝水,先判斷杯子有沒有水
  if (Q->size <= 0)
  {
    std::cout << "爲空,沒法出隊" << std::endl;
    return 0;
  }
  else
  {
    //假設第一個做業是最短的
    min = Q->Queue[0];  //1
    for (int i = 1; i < Q->size; i++)
    {
      //多了一個數據項  按照權值排序
      //0
      if (Q->Queue[i].priority < min.priority)
      {
        min = Q->Queue[i];
        minIndex = i;    //出隊依據就是最小做業序號
      }
    }
    *A = Q->Queue[minIndex];
    //難點 
    //刪除完數組後,後面的元素往前移動
    for (int i = minIndex + 1; i < Q->size; i++)
    {
      Q->Queue[i - 1] = Q->Queue[i];
      minIndex = i;
    }
    Q->size--;
    return 1;
  }
 
 
 
}
//獲取隊頭元素
int GetQueue(PriQueue *Q, DataType *A)
{
  DataType min;    //最小的開始,排序
  int minIndex = 0;
  //短做業優先法
  //喝水,先判斷杯子有沒有水
  if (Q->size <= 0)
  {
    std::cout << "爲空,沒法出隊" << std::endl;
    return 0;
  }
  else
  {
    //假設第一個做業是最短的
    min = Q->Queue[0];  //1
    for (int i = 1; i < Q->size; i++)
    {
      //多了一個數據項  按照權值排序
      //0
      if (Q->Queue[i].priority < min.priority)
      {
        min = Q->Queue[i];
        minIndex = i;    //出隊依據就是最小做業序號
      }
    }
    *A = Q->Queue[minIndex];
    return 1;
  }
}

但願對你們有幫助!

另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!

C語言C++編程學習交流圈子,QQ羣1095293493點擊進入】微信公衆號:C語言編程學習基地

分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!

編程學習軟件分享:

編程學習視頻分享: