1. 程式人生 > >資料結構之佇列的順序表示及其實現(迴圈佇列)

資料結構之佇列的順序表示及其實現(迴圈佇列)

記錄一下自己學習過程中寫的程式碼。以下是我看嚴蔚敏老師的資料結構教材後,結合教材所講用C語言實現了關於佇列的順序表示及其實現的基本操作,供以後複習所用。和順序棧類似,在佇列的順序儲存結構中,除了用一組地址連續的儲存單元一次存放從隊頭到隊尾的元素之外,尚需附設隊頭指標Front和隊尾指標Rear分別指示隊頭元素和隊尾元素的位置。初始化建立一個空佇列的時候,令隊頭指標和隊尾指標值都為0,每當插入新的隊尾元素時,Rear加1;每當刪除隊頭元素時,Front加1。因而,在非空佇列中,隊頭指標始終指向隊頭元素,隊尾指標始終指向隊尾元素的下一個位置(非隊尾元素所在位置)。在本程式中,考慮到可能因為插入元素時導致越界而使得程式程式碼被破壞,採用一種環狀的結構,即迴圈佇列來實現佇列的順序表示。可以看到,在輸入一致的情況下,無論是用鏈佇列還是迴圈佇列,所得到的最終結果是一樣的。

編譯軟體:VC++6.0 

測試用例結果截圖如下:


原始碼如下:

/********************************** 
迴圈佇列——佇列的順序表示和實現(完整程式碼,C實現)
Author:大地在我腳下 
Date:2016-8-6
Email:[email protected] 
**********************************/  
#include<stdio.h>
#include<stdlib.h>

#define	MAXQSIZE  100//最大佇列長度

typedef struct LinkQueue
{  
 int Front;  
 int Rear;
 int* base; //初始化的動態分配儲存空間
 int Queuesize;
}LinkQueue,*Queue;  

bool CreateQueue(Queue);//建立迴圈佇列
bool DeleteQueue(Queue,int*);//在隊頭刪除元素
bool QueueEmpty(Queue); //佇列是否為空
bool EnterQueue(Queue,int);//在隊尾插入元素
void TraverseQueue(Queue);//遍歷佇列並輸出元素
void DestroyQueue(Queue);//銷燬已存在的佇列
void ClearQueue(Queue);//清空已存在的佇列
int Queuelength(Queue);//計算佇列長度,即佇列元素個數
int GetHead(Queue);//返回佇列隊頭元素


void main()
{int d;LinkQueue Q;
//建立一個空的迴圈佇列
if(CreateQueue(&Q)==1)
     printf("Successfully build queue!\n");  

//進行入隊(插入)操作,之後遍歷輸出佇列內資料
EnterQueue(&Q,6);
EnterQueue(&Q,25);
EnterQueue(&Q,89);
EnterQueue(&Q,127);
EnterQueue(&Q,888);
TraverseQueue(&Q);

//當前佇列的長度
printf("\nNow the length of queue is:%d\n",Queuelength(&Q));

//取出隊頭元素
if(QueueEmpty(&Q)) 
    printf("\nNow the queue is empty!");
else printf("Now the head of queue is:%d\n",GetHead(&Q));

//進行出隊(刪除)操作,之後遍歷輸出
if(QueueEmpty(&Q)) 
   printf("\nNow the queue is empty!");
else
{printf("\nDeleting succeed!\n");
 DeleteQueue(&Q,&d);
 printf("The deleted data is:%d\n",d);
 TraverseQueue(&Q);
}

//重新輸出佇列的長度
printf("\nNow the length of queue is:%d\n",Queuelength(&Q));

//重新取出隊頭元素
if(QueueEmpty(&Q)) 
    printf("\nNow the queue is empty!");
else printf("Now the head of queue is:%d\n",GetHead(&Q));

//清空佇列,並輸出清空後佇列中的資料  
ClearQueue(&Q);  
printf("\ndata cleared!\n");  
TraverseQueue(&Q);
}

//建立迴圈佇列
bool CreateQueue(Queue Q)
{Q->base=(int*)malloc(MAXQSIZE*sizeof(int));
 if(!Q->base)
 {printf("Malloc failed!");
  exit(-1);
 }
Q->Front=Q->Rear=0;
Q->Queuesize=0;
return true;
}

bool EnterQueue(Queue Q,int e)
{if((Q->Rear+1)%MAXQSIZE==Q->Front)//迴圈佇列滿
{printf("Now the queue is full!");
return false;
}
*(Q->base+Q->Rear)=e;
Q->Rear=(Q->Rear+1)%MAXQSIZE;
 Q->Queuesize++;
 return true;
}

bool QueueEmpty(Queue Q)
{if(Q->Rear==Q->Front) return true;
else return false;
}

bool DeleteQueue(Queue Q,int *d)
{
 if(QueueEmpty(Q)) 
 {printf("Now the queue is empty!");
 return false;
 }
 *d=*(Q->base+Q->Front);
 Q->Front=(Q->Front+1)%MAXQSIZE;
 Q->Queuesize--;
return true;
}

void TraverseQueue(Queue Q)
{int p=Q->Front;
if(QueueEmpty(Q))  printf("Now the queue is empty!\n");
else 
{printf("Now datas in the queue are:\n");
while(p!=Q->Rear)
{printf("%d",*(Q->base+p));
 p=(p+1)%MAXQSIZE;  
 putchar(32);
}
printf("\n");
}
}

void DestroyQueue(Queue Q)
{free(Q->base);
Q->Rear=0;
Q->Front=0;
Q->Queuesize=0;
}

void ClearQueue(Queue Q)
{if(QueueEmpty(Q))  printf("Now the queue is empty!");
else DestroyQueue(Q);
}

int Queuelength(Queue Q)
{return Q->Queuesize;
}

int GetHead(Queue Q)
{return *(Q->base+Q->Front);
}



相關推薦

資料結構佇列順序表示及其實現迴圈佇列

記錄一下自己學習過程中寫的程式碼。以下是我看嚴蔚敏老師的資料結構教材後,結合教材所講用C語言實現了關於佇列的順序表示及其實現的基本操作,供以後複習所用。和順序棧類似,在佇列的順序儲存結構中,除了用一組地址連續的儲存單元一次存放從隊頭到隊尾的元素之外,尚需附設隊頭指標Fron

資料結構 串的順序表示實現

上次寫鏈式串的時候就覺得太麻煩了,而且還不一定好用,今天就寫順序的果然方便很多。 寫的串是常用的字串以及一些常用函式。 全部自己原創的,如有不足還請指出。 #include <iostream> using namespace std; const int MAXN =

資料結構——線性表的順序表示實現c語言

PS:資料結構(C語言版)——清華大學出版社, 2.1節程式碼實現#include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define E

資料結構鏈式表的實現--單向迴圈連結串列(C語言)

 學習參考: 嚴蔚敏: 《資料結構-C語言版》 單向迴圈連結串列的基本操作 單向迴圈連結串列的建立 單向迴圈連結串列新增結點(頭插法) 單向迴圈連結串列新增結點(尾插法) 單向迴圈連結串列

資料結構——線性錶鏈式表示實現2

本文所有程式碼均為偽碼,僅闡述演算法基本思想——《資料結構》清華大學出版社 - 演算法1 帶頭結點的雙向迴圈連結串列(儲存結構由c2-4.h定義)的基本操作(14個) typedef struct DuLNode { ElemType data;

資料結構】鏈式棧的實現C語言

棧的鏈式儲存稱為鏈式棧,鏈式棧是一種特殊的單鏈表,它的插入和刪除規定在單鏈表的同一端進行。鏈式棧的棧頂指標一般用top表示。(個人理解:相當於只對單鏈表的第一個結點進行操作) 鏈式棧要掌握以下基本操作: 1、建立一個空鏈式棧 2、判斷鏈式棧是否為空 3、讀鏈式棧的

資料結構——一元多項式的表示及相加C語言

//一元多項式的表示及相加 #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #defi

資料結構樹的層次遍歷附帶查詢、深度求值

二叉樹的層次遍歷,顧名思義就是指從二叉樹的第一層(根節點)開始,從上至下逐層遍歷,在同一層中,則按照從左到右的順序對節點逐個訪問。 演算法思想:用一個佇列儲存被訪問的當前節點的左右孩子以實現層序

資料結構程式碼實現佇列的連結串列實現C/C++

上班閒著無聊,一直想著要開始寫部落格,但又不知道寫什麼。最近又回顧了下資料結構的知識,那就從資料結構開始吧。 前言 關於C語言結構體的知識以及佇列的特性請讀者自行了解,此處不做過多解釋,嘻嘻。 同時此篇文章僅僅是關於佇列的連結串列實現。 第一步:結構體編寫 我們首先分析一下佇列的

數據結構動態順序表(C實現)

int 隊列 destroy element 類型 for str ttr def 線性表有2種,分為順序表和鏈表。 順序表: 采用順序存儲方式,在一組地址連續的存儲空間上存儲數據元素的線性表(長度固定) 鏈表: 有3種,單鏈表、雙向鏈表、循環鏈表(長度不固定)

資料結構連結串列C語言實現以及使用場景分析

連結串列是資料結構中比較基礎也是比較重要的型別之一,那麼有了陣列,為什麼我們還需要連結串列呢!或者說設計連結串列這種資料結構的初衷在哪裡? 這是因為,在我們使用陣列的時候,需要預先設定目標群體的個數,也即陣列容量的大小,然而實時情況下我們目標的個數我們是不確定的,因此我們總是要把陣列的容量設定的

資料結構與演算法分析c語言描述Mark Allen--佇列ADT連結串列實現

佇列ADT連結串列實現 使用連結串列儲存 操作集合 入隊 出隊 初始化 返回隊前元素 列印 #include <stdio.h> #includ

資料結構與演算法分析c語言描述Mark Allen--迴圈佇列ADT陣列實現

迴圈佇列ADT陣列實現 使用陣列儲存 操作集合 入隊 出隊 清空 初始化 返回隊前元素 列印 重點注意! 對於一個迴圈佇列 front == rear時候佇列

資料結構靜態順序表和動態順序

@Sock對靜態順序表和動態順序表的總結 簡單概括他們的異同點 相同點:記憶體空間連續, 資料順序儲存 不同點:它們所佔記憶體空間的位置不同, 靜態定義一個順序表, 順序表所佔的記憶體空間開闢在記憶體的靜態區, 即所謂的函式棧上, 隨著函式呼叫的結束, 這塊記憶體區域會被系統自動

資料結構動態順序

動態順序表 動態順序表是跟靜態順序表大體相似,有些地方是不同的,動態順序表是在動態變化中,當我們的所需的記憶體不夠時,它會自動開闢一個我們需要的空間,來供我們使用。 動態順序表與靜態順序表的不同在於初始化/銷燬/所有插入,其他和靜態順序表完全一樣。 定義一個結構體 先將我們需

資料結構靜態順序

title: 資料結構之靜態順序表 date: 2018-11-09 14:21:51 tags: C-資料結構 靜態順序表屬於資料結構開始的一種基本結構 首先我們要知道資料結構的概念 資料結構 資料的組織關係 演算法 為了達到特定的目的的一系列過程。在這個過程中又

資料結構鏈式表的實現--單鏈表(C語言)

學習參考: 嚴蔚敏: 《資料結構-C語言版》 基本操作: 單鏈表的建立 新增結點(頭插法) 新增結點(尾插法) 單鏈表的輸出 單鏈表的修改 單鏈表的插入 單鏈表的刪除 單鏈表按

資料結構—— 一元多項式的表示及相加C語言實現

程式碼比較簡單,沒有完全按照嚴蔚敏版《資料結構(C語言版)》上39頁到43頁上的要求,只是實現了簡單功能,且此程式碼輸入多項式時只能按升冪的順序輸入(因為沒有寫多項式排序的函式) 個人感覺此程式碼短小精悍,且易理解,看懂了的話可以嘗試完全按照書上的要求自己寫程式

資料結構——2.1線性表及其實現

一、引言 線性結構是資料結構裡面最基礎最簡單的一種資料結構型別,最典型的一種叫做線性表。 舉個例子: 如何用程式設計語言來表示這樣的一個一元多項式及其相應的操作運算呢? 順序儲存結構直接表示 用一個數組儲存第i項的係數ai,而指數對應這個分量的下標 這樣帶

關於資料結構單鏈表的C++實現

1、連結串列List的基本單元是節點Node,因此想要操作方便,就必須為每一步打好基礎,Node的基本結構如下: class Node { public: int data; Node *next; Node(int da=0,Node *p=NULL) { t