這一章我們來看佇列
佇列的概念:
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(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...