佇列的基本操作
佇列的儲存結構有兩種:一種是線性表儲存,一種是鏈式儲存。用線性表儲存時,要注意佇列的長度有沒有超過預先設定的大小,在這個程式中,佇列的可以在存滿的時候,自動增加佇列的長度。用連結串列儲存,則沒有長度的限制。下面分別是這兩種儲存結構的實現。
線性表儲存:
#include <stdio.h>
#include <stdlib.h>
#define QUEUE_INIT_SIZE 10
#define QUEUE_REALLOCATION 2
typedef int ElemType;
/*順序佇列的儲存結構定義*/
typedef struct SqQueue
{
ElemType *base;
int front;
int rear;
int QueueLength;
}SqQueue;
void Init_SqQueue(SqQueue *S)
{
S->base = (ElemType*)malloc(QUEUE_INIT_SIZE*sizeof(ElemType));
if (!S->base)
exit(1);
S->rear = S->front = 0;
S->QueueLength = QUEUE_INIT_SIZE;
}
void En_SqQueue(SqQueue *S, ElemType e)
{
if ((S->rear + 1) % S->QueueLength == S->front){
S->base = (ElemType*)malloc(S->base,(S->QueueLength+QUEUE_REALLOCATION)*sizeof(ElemType));
if (!S->base)
exit(1);
if (S->front > S->rear){
int i;
for (i = S->front; i < S->QueueLength; ++i){
S->base[i + QUEUE_REALLOCATION] = S->base[i];
}
S->front += QUEUE_REALLOCATION;
}
S->QueueLength += QUEUE_REALLOCATION;
}
S->base[S->rear] = e;
S->rear = (S->rear + 1) % S->QueueLength;
}
int De_SqQueue(SqQueue *S, ElemType *e)
{
if (S->rear == S->front)
return 0;
*e = S->base[S->front];
S->front = (S->front + 1) % S->QueueLength;
return 1;
}
int SqQueueLength(SqQueue S)
{
return (S.rear - S.front + S.QueueLength) % S.QueueLength;
}
int is_SqQueueEmpty(SqQueue S)
{
if (S.front == S.rear)
return 1;
else
return 0;
}
void SqQueueTest()
{
SqQueue S;
Init_SqQueue(&S);
printf("Please input some numbers to enqueue(Ctrl+Z to end):\n");
int e;
while (scanf("%d", &e) != EOF)
En_SqQueue(&S, e);
printf("The dequeue sequence is:\n");
while (!is_SqQueueEmpty(S)){
De_SqQueue(&S,&e);
printf("%d ",e);
}
printf("\n");
}
int main()
{
SqQueueTest();
return 0;
}
連結串列儲存:
#include <stdio.h>
#include <stdlib.h>
/*鏈式佇列的儲存結構定義*/
typedef struct LinkQueue_Node
{
ElemType data;
struct LinkQueue_Node *next;
}*Queue_pNode, Queue_Node;
typedef struct LinkQueue
{
struct LinkQueue_Node *front;
struct LinkQueue_Node *rear;
}LinkQueue;
void Init_LinkQueue(LinkQueue *L)
{
L->front = L->rear = (Queue_pNode)malloc(sizeof(Queue_Node));
if (!L->front)
exit(1);
L->front->data = 0;
L->front->next = NULL;
}
void En_LinkQueue(LinkQueue *L, ElemType e)
{
Queue_pNode p = (Queue_pNode)malloc(sizeof(Queue_Node));
if (!p)
exit(1);
p->data = e;
p->next = NULL;
L->rear->next = p;
L->rear = p;
}
int De_LinkQueue(LinkQueue *L, ElemType *e)
{
Queue_pNode p=L->front->next;
if (L->front == L->rear)
return 0;
*e = p->data;
L->front->next = p->next;
if (p == L->rear)
L->rear = L->front;
free(p);
return 1;
}
int LinkQueueLength(LinkQueue L)
{
Queue_pNode p = L.front;
if (L.front == L.rear)
return 0;
int length = 0;
while (p != L.rear){
++length;
p = p->next;
}
return length;
}
int is_LinkQueueEmpty(LinkQueue L)
{
if (L.front == L.rear)
return 1;
else
return 0;
}
void LinkQueueTest()
{
LinkQueue L;
Init_LinkQueue(&L);
printf("Please input some numbers to enqueue(Ctrl+Z to end).\n");
int e;
while (scanf("%d", &e) != EOF)
En_LinkQueue(&L,e);
printf("The dequeue sequence is : \n");
while (!is_LinkQueueEmpty(L)){
De_LinkQueue(&L,&e);
printf("%d ",e);
}
printf("\n");
}
int main()
{
LinkQueueTest();
return 0;
}
相關文章
- Laravel 佇列基本操作Laravel佇列
- 迴圈佇列的基本操作佇列
- 順序佇列基本操作佇列
- 實驗四 棧和佇列的基本操作佇列
- 資料結構實驗5、鏈佇列的基本操作資料結構佇列
- 陣列的基本操作陣列
- 總結訊息佇列RabbitMQ的基本用法佇列MQ
- scala佇列、並行集合基本使用佇列並行
- 自定義單連結串列佇列的基本介面函式(非迴圈佇列)佇列函式
- 初識Java(Java陣列-陣列的基本操作)Java陣列
- 兩個棧實現佇列操作佇列
- 佇列、阻塞佇列佇列
- 陣列模擬佇列 以及佇列的複用(環形佇列)陣列佇列
- 訊息佇列(Message Queue)基本概念佇列
- Python 通過List 實現佇列的操作Python佇列
- 連續同源非同步操作佇列非同步佇列
- Scala—— Set、Map、Tuple、佇列操作實戰佇列
- 佇列-單端佇列佇列
- 舌尖上的javascript陣列和字串基本操作JavaScript陣列字串
- C語言 簡單的佇列(陣列佇列)C語言佇列陣列
- uva 11995 棧,佇列,優先佇列,等基本資料結構的應用與理解佇列資料結構
- 阻塞佇列一——java中的阻塞佇列佇列Java
- synchronized 中的同步佇列與等待佇列synchronized佇列
- 8-佇列的鏈式儲存結構的操作佇列
- 樹狀陣列3種基本操作陣列
- 佇列 和 迴圈佇列佇列
- 【佇列】【懶排序】佇列Q佇列排序
- JavaConcurrentLinkedQueue佇列執行緒安全操作Java佇列執行緒
- 條件佇列大法好:wait和notify的基本語義佇列AI
- 佇列的一種實現:迴圈佇列佇列
- Swift學習筆記(二十)——陣列的基本操作Swift筆記陣列
- laravel的佇列Laravel佇列
- [原始碼解析] 訊息佇列 Kombu 之 基本架構原始碼佇列架構
- php實現基本資料結構之棧、佇列PHP資料結構佇列
- 佇列 手算到機算 入門 佇列 迴圈佇列佇列
- 圖解--佇列、併發佇列圖解佇列
- 單調佇列雙端佇列佇列
- 佇列的順序儲存--迴圈佇列的建立佇列