下面通過乙個例項來說明鏈式佇列的具體使用。
例5_3 程式設計判斷乙個字串行是否是回文。回文是指乙個字串行以中間字元為基準兩邊字元完全相同,即順著看和倒著看是相同的字串行。如字串行「xyzazyx」就是回文,而字串行"xyzbzxy"就不是回文。
分析:考察棧的「先進後出」和佇列的「先進先出」的特點,可以通過構造棧和佇列實現。可以把字串行分別存入佇列和堆疊,然後依次把字元逐個出佇列和出棧,比較出佇列的字元和出棧的字元是否相等,如果全部相等則該字串行是回文,否則不是回文。
我們在這裡採用鏈式堆疊和只有隊尾指標的鏈式迴圈佇列實現,實現**如下。
#include/*包含輸出函式*/
#include/*包含退出函式*/
#include/*包含字串長度函式*/
#include/*包含記憶體分配函式*/
typedef char datatype; /*型別定義為字元型別*/
/*鏈式堆疊結點型別定義*/
typedef struct snode
lsnode;
/*只有隊尾指標的鏈式迴圈佇列型別定義*/
typedef struct qnode
lqnode,*linkqueue;
void initstack(lsnode **head)
/*帶頭結點的鏈式堆疊初始化*/
else
(*head)->next=null; /*頭結點的指標域設定為空*/
}int stackempty(lsnode *head)
/*判斷帶頭結點鏈式堆疊是否為空。如果堆疊為空,返回1,否則返回0*/
int pushstack(lsnode *head,datatype e)
/*鏈式堆疊進棧。進棧成功返回1,否則退出*/
}int popstack(lsnode *head,datatype *e)
/*鏈式堆疊出棧,需要判斷堆疊是否為空。出棧成功返回1,否則返回0*/
}void initqueue(linkqueue *rear)
/*將帶頭結點的鏈式迴圈佇列初始化為空佇列,需要把頭結點的指標指向頭結點*/
int queueempty(linkqueue rear)
/*判斷鏈式佇列是否為空,隊列為空返回1,否則返回0*/
int enterqueue(linkqueue *rear,datatype e)
/*將元素e插入到鏈式佇列中,插入成功返回1*/
int deletequeue(linkqueue *rear,datatype *e)
/*刪除鏈式佇列中的隊頭元素,並將該元素賦值給e,刪除成功返回1,否則返回0*/
{lqnode *f,*p;
if(*rear==(*rear)->next) /*在刪除隊頭元素即出佇列之前,判斷鏈式佇列是否為空*/
return 0;
else
{f=(*rear)->next; /*使指標f指向頭結點*/
p=f->next; /*使指標p指向要刪除的結點*/
if(p==*rear) /*處理佇列中只有乙個結點的情況*/
{*rear=(*rear)->next;/*使指標rear指向頭結點*/
(*rear)->next=*rear;
簡單選擇排序 零基礎學資料結構
簡單選擇排序選擇排序的基本思想是 從待排序的元素序列中選擇關鍵字最小或最大的元素,將其放在已排序元素序列的最前面或最後面,其餘的元素構成新的待排序元素序列,並從待排序元素序列中選擇關鍵字最小的元素,將其放在已排序元素序列的最前面或最後面。依次類推,直到待排序元素序列中沒有待排序的元素,選擇排序結束。...
簡單選擇排序 零基礎學資料結構
簡單選擇排序選擇排序的基本思想是 從待排序的元素序列中選擇關鍵字最小或最大的元素,將其放在已排序元素序列的最前面或最後面,其餘的元素構成新的待排序元素序列,並從待排序元素序列中選擇關鍵字最小的元素,將其放在已排序元素序列的最前面或最後面。依次類推,直到待排序元素序列中沒有待排序的元素,選擇排序結束。...
簡單選擇排序 零基礎學資料結構
簡單選擇排序選擇排序的基本思想是 從待排序的元素序列中選擇關鍵字最小或最大的元素,將其放在已排序元素序列的最前面或最後面,其餘的元素構成新的待排序元素序列,並從待排序元素序列中選擇關鍵字最小的元素,將其放在已排序元素序列的最前面或最後面。依次類推,直到待排序元素序列中沒有待排序的元素,選擇排序結束。...