佇列的基本操作

2021-10-24 06:24:47 字數 3605 閱讀 7502

這一章我們來看佇列

佇列的概念:

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

其實我們來對比棧,棧的特點是只能在一端進行操作的,而佇列是一端插入一端刪除。

用一句很有歧義卻很形象的話來講兩者的區別就是:棧就是插進去抽出來,而佇列是插進去吐出來。

我們還是上圖來更加直觀的看佇列

佇列分為兩種,一種是順序佇列,一種是迴圈佇列。

其實從儲存結構上講,佇列也分為兩種,一種是順序佇列,一種是鏈佇列。

如果從儲存上加以區分的話,在實際的物理空間中,資料集中儲存的佇列是順序佇列,分散儲存的佇列是鏈佇列。

順序佇列的簡單實現(我們要採用陣列)

初始是這樣的,因為還沒有存放任何元素

我們來看入隊的過程

我們來看出隊的過程

其實這裡涉及假溢位和真溢位

我們來解釋下

假溢位:就是明明儲存空間還有,卻放不下資料了。

真溢位:很好理解,就是真的插不進去了。因為空間真的不夠用了,被塞滿了。

我們來看順序表實現佇列的操作

上**:

我們這樣實現就很簡單,避免了使用結構體

#include int pushqueue(int *a,int rear,int data)

void dequeue(int *a,int front,int rear)

}int main()

這樣的順序表的實現方式存在假溢位的假象。這樣太浪費空間了。我我們想了一種辦法,就是採用迴圈的結構,就是把它看做乙個頭尾相接迴圈結構。

我們要判斷隊滿和隊空,但是我們發現,在隊滿和隊空的情況下,都存在head=tail的情況,或者是font=rear。我們想辦法進行區分。

兩種辦法:

1:少用乙個資料元素的空間,當隊尾指標所指的空閒單元的後繼單元是隊頭元素所在的單元時,我們就認為隊滿,不再插入新的元素。我們有這樣判斷(q.rear+1)%maxsize==q.font,如果滿足這個條件,隊就滿了。隊空的條件不受影響,就是q.rear == q.font.

我們來看迴圈佇列的結構體定義

#define maxsize 1024

typedef int elemtype

typedef struct sequenqueue

sequenqueue;

我們來看一些操作1:初始化

sequencequeue *init_sequenqueue()

return q;

}

2:判斷佇列是否為空

int sequen_empty(sequenqueue * q)

else

}

其他的操作都是大同小異的,注意用到空間申請函式了,我們要加上相應的標頭檔案。

能夠把複雜的東西做的簡單才是最明智的。

我們還是不用結構體。。來看乙個完整**。

下面展示一些內聯**片

#include #define max 5//表示順序表申請的空間大小

int enqueue(int *a,int front,int rear,int data)

a[rear%max]=data;

rear++;

return rear;

}int dequeue(int *a,int front,int rear)

printf("%d ",a[front]);

//front不再直接 +1,而是+1後同max進行比較,如果=max,則直接跳轉到 a[0]

front=(front+1)%max;

return front;

}int main()

如果不是很理解結構體,用這種方式其實也是同樣的道理。

我們來看鏈棧如何實現

鏈佇列的初始狀態

初始狀態,尾指標和頭指標都指向頭結點。

我們來看結構;

typedef struct qnodeqnode;
1:初始化:

下面展示一些內聯**片

qnode * initqueue()
3:出隊操作

我們來看**:

下面展示一些內聯**片

void dequeue(qnode * top,qnode * rear)

// 1、

qnode * p=top->next;

printf("%d",p->data);

top->next=p->next;

if (rear==p)

free(p);

}

這裡和鍊錶真的太像了

我們來看完整**;

#include #include typedef struct qnodeqnode;

qnode * initqueue()

qnode* enqueue(qnode * rear,int data)

qnode* dequeue(qnode * top,qnode * rear)

qnode * p=top->next;

printf("%d ",p->data);

top->next=p->next;

if (rear==p)

free(p);

return rear;

}int main()

oj8k,佇列的總結就到這裡了,歡迎關注下期博文。

相關的請遵守csdn協議

-------博主jgdabc

更多這裡博主jgdabc博文頁面

佇列的基本操作

include stdafx.h includeusing namespace std typedef struct node typedef struct queue queue insertqueue queue q,char value return q queue deletequeue q...

佇列的基本操作

本程式主要是實現了迴圈佇列的基本操作,包括insert,remove,peek,size等操作 package demo3 class queue 插入操作 public void insert long j quearray rear j 佇列是在隊尾插入 nitems 刪除 public lon...

佇列的基本操作

鏈式儲存 typedef int qelemtype typedef int status 具體資料型別具體定義 typedef struct qnode 佇列結點結構體 qnode,queueptr typedef struct 鏈佇列型別 linkqueue status initqueue l...