實驗四 佇列的基本操作
一、實驗目的
1.掌握佇列儲存結構的表示和實現方法。
2.掌握佇列的入隊和出隊等基本操作的演算法實現。
3.瞭解佇列在解決實際問題中的簡單應用。
二、實驗內容
1.建立順序迴圈佇列,並在順序迴圈佇列上實現入隊、出隊基本操作。
2.建立迴圈鏈佇列,並在迴圈鏈佇列上實現入隊、出隊基本操作(選做)。
三、實驗要求
1.建立順序迴圈佇列,並在順序迴圈佇列上實現入隊、出隊基本操作。
(1)根據輸入的佇列長度n和各元素值建立一個迴圈順序表表示的佇列(迴圈佇列),並輸出佇列中各元素值。
(2)將資料元素e入隊,並輸出入隊後的佇列中各元素值。
(3)將迴圈佇列的隊首元素出隊,並輸出出隊元素的值和出隊後佇列中各元素值。
2.程式設計實現對迴圈鏈佇列的入隊和出隊操作。
(1)根據輸入的佇列長度n和各元素值建立一個帶頭結點的迴圈連結串列表示的佇列(迴圈鏈佇列),並且只設一個尾指標來指向尾結點,然後輸出佇列中各元素值。
(2)將資料元素e入隊,並輸出入隊後的佇列中各元素值。
(3)將迴圈鏈佇列的隊首元素出隊,並輸出出隊元素的值和出隊後佇列中各元素值。
四、詳細程式清單
//1.順序迴圈佇列 #include<stdio.h> #include<stdlib.h> #define MAXQSIZE 100 typedef struct{ int *base; int front; int rear; }SqQueue; SqQueue Q; int Create(SqQueue &Q,int n) //建立 { int e; Q.base=(int *)malloc(MAXQSIZE*sizeof(int)); if(n>MAXQSIZE-1) { printf("超出最大值\n"); return 0; } Q.front=Q.rear=0; printf("輸入佇列的元素: \n"); for(Q.rear=0;Q.rear<n;Q.rear++) { scanf("%d",&e); Q.base[Q.rear]=e; } } int Show(SqQueue Q)//顯示 { printf("當前順序佇列元素為: "); if (Q.front==Q.rear) { printf("佇列為空\n"); return 0; } int p; p=Q.front; while (p!=Q.rear) { printf("%d ",Q.base[p%MAXQSIZE]); p++; } printf("\n"); } int EnQueue(SqQueue &Q, int e)//入佇列 { if((Q.rear+1)%MAXQSIZE==Q.front) { printf("佇列滿\n"); return 0; } Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; } int DeQueue(SqQueue &Q)//出佇列 { int e; if (Q.front==Q.rear) { printf("佇列為空\n"); return 0; } e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXQSIZE; printf("出佇列元素為: %d\n",e); } int main() { int select,e,n; printf("1.建立佇列\t2.入佇列\t3.出佇列\t4.退出\n"); while(1) { printf("選擇操作: "); scanf("%d",&select); switch(select) { case 1: printf("輸入佇列的長度(小於%d): ",MAXQSIZE); scanf("%d",&n); Create(Q,n); Show(Q); break; case 2: printf("輸入入佇列元素: "); scanf("%d",&e); EnQueue(Q,e); Show(Q); break; case 3: DeQueue(Q); Show(Q); break; case 4: return 0; default: printf("輸入錯誤\n"); break; } } return 0; }
//2.鏈迴圈佇列(頭結點為空) #include<stdio.h> #include<stdlib.h> typedef struct QNode{ int data; struct QNode *next; }QNode,*LinkQueue; LinkQueue rear,head;//尾指標和頭結點,這裡沒有用front而是head,因為這裡的頭結點不是動態的,而是固定的,用head以區分順序迴圈佇列的front int EnQueue(int e)//入佇列 { LinkQueue p; p=(LinkQueue)malloc(sizeof(QNode)); p->data=e; rear->next=p; rear=p; rear->next=head; } int Create(int n)//建立 { LinkQueue p; int e; head=(LinkQueue)malloc(sizeof(QNode)); rear=head; head->next=rear; rear->next=head; rear->data=head->data=NULL; printf("輸入佇列元素: "); while(n--) { scanf("%d",&e); EnQueue(e);//這裡直接呼叫入隊函數了,程式碼是一樣的 } } int Show()//顯示 { LinkQueue p; printf("當前佇列元素為: "); p=head->next; if(head==rear)//佇列為空時 { printf("佇列為空\n"); return 0; } for (;p!=rear;p=p->next) { printf("%d ",p->data); } printf("%d\n",p->data); } int DeQueue()//出佇列 { int e; LinkQueue p; p=head->next; e=p->data; if(head==rear)//佇列為空時 { printf("佇列為空\n"); return 0; } head->next=head->next->next; if(head->next==head) { rear=head; } free(p); printf("出佇列元素為: %d\n",e); } int main() { int select,e,n; printf("1.建立佇列\t2.入佇列\t3.出佇列\t4.退出\n"); while(1) { printf("選擇操作: "); scanf("%d",&select); switch(select) { case 1: printf("輸入佇列的長度: "); scanf("%d",&n); Create(n); Show(); break; case 2: printf("輸入入佇列元素: "); scanf("%d",&e); EnQueue(e); Show(); break; case 3: DeQueue(); Show(); break; case 4: return 0; default: printf("輸入錯誤\n"); break; } } return 0; }
四、程式執行結果
1.順序迴圈佇列:
2. 鏈迴圈佇列
五、實驗心得體會
1. 通過這次的操作,我對順序佇列中的“假上溢”有了更好的理解,讓順序佇列進行迴圈操作可以防止“假上溢”;
2. 但是對於鏈迴圈佇列,我不明白為什麼要讓它迴圈,因為鏈佇列不存在“上溢”的情況,而且佇列只能尾進頭出,不能像連結串列一樣在任意位置插入新元素,所以我覺得讓鏈佇列進行迴圈操作好像沒有意義??
3. 鏈佇列的頭指標我用的是head而不是front,因為這裡的頭結點不是動態的,而是固定的,用head以區分順序迴圈佇列的動態頭結點front;
4. 鏈佇列的頭結點我沒有賦值,是空的。開始的時候是想把頭結點也賦值的,但是這樣會出現很多問題:建立、入隊、判空、全部出隊後的重新入隊都很麻煩,於是為了方便頭結點沒有賦值;
5. 之前幾次實驗的執行結果看起來太亂,這次我給改簡潔了;
6. 錯誤很多,除錯很煩,要有耐心。
相關推薦
實驗四 佇列的基本操作
一、實驗目的 1.掌握佇列儲存結構的表示和實現方法。 2.掌握佇列的入隊和出隊等基本操作的演算法實現。 3.瞭解佇列在解決實際問題中的簡單應用。 二、實驗內容 1.建立順序迴圈佇列,並在順序迴圈佇列上實現入隊、出隊基本操作。 2.建立迴圈鏈佇列,並在迴圈鏈佇列上實現入隊、
Git基礎入門(四)Git基本操作2
git 操作 基礎忽略文件: 在實際開發過程中總有些文件無需納入Git的管理,比如日誌文件、臨時文件等 在這種情況下,我們可以在工作目錄中創建一個名為.gitignore的文件,列出要忽略的文件名或者表達式 例:cat .gitignore *.[oa]
佇列基本操作
佇列:只允許在一端進行插入資料操作,在另一端進行刪除資料操作的特殊線性表,佇列具有先進先出 FIFO(First In First Out) 入佇列:進行插入操作的一端稱為隊尾 出佇列:進行刪除操作的一端稱為隊頭 Queue.h #define _CRT_SECURE_NO_WARNIN
四步基本操作告訴你CAJ如何轉換為Word?
CAJ檔案是一種常用的檔案格式,與PDF檔案一樣只是一種單純的檔案格式而已。但是CAJ檔案一般情況下不能直接開啟,看不到檔案裡面的內容。所以檢視CAJ檔案需要找相關的閱讀器,或者是轉換CAJ檔案的格式。例如轉換為Word檔案,這樣就會方便檢視它的檔案內容。 &nbs
資料結構 順序佇列 迴圈佇列 基本操作
順序佇列基本操作: #define MAXSIZE 1000 struct queue{ int front ,rear;//表示頭指標和 尾指標 int data[MAXSIZE]; //儲存資料的陣列 } void Initqueue(queue &
SQL Server 2008 資料庫_實驗四_SQL DDL 操作
SQL DDL 操作、 什麼是SQL DDL 操作? DDL是SQL定義語言,它主要包括三個關鍵字:create ,alter , drop(資料庫關鍵字不分大小寫 ),主要操作物件 有資料庫、表、索引、檢視等。 語句說明: 建立資料庫 create databas
佇列基本操作及銀行簡易排號的實現
佇列是特殊的線性表,只允許在表的前端進行刪除操作,在表的後端進行插入操作,進行插入操作的端叫隊尾,進行刪除操作的端成為隊頭,當佇列中沒有元素時,稱為空佇列。佇列是一種先進先出(First In First Out)的結構,採用順序儲存和鏈式儲存方式。 在佇列用順序儲存方式
資料結構-鏈佇列基本操作
都是些基本操作,有興趣的可以看看。 1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct QNode { 4 int data; 5 struct QNode *next; 6 }QNod
mongodb 4.0.3 下載和安裝、資料庫的四種基本操作
一:安裝和win7配置 在mongdb官網上下載,通常下載msi最新版本。 此處下載過程省掉..... 強調:在安裝過程中請關閉所有的防毒軟體。安裝截圖如下: 安裝過程中此處選擇Custom. 左下角的 I
順序佇列基本操作的實現----入隊、出隊、列印
以順序儲存結構對佇列進行操作----入隊、出隊、列印並判斷佇列現有長度(以類的形式) 程式如下: queue.h 標頭檔案 #pragma once #include <iostream> class queue { private: int *dat
佇列基本操作 出隊與入隊
#include<stdio.h> #include<stdlib.h> typedef struct QNode { //構造結點型別 int data; struct QNode *next; }*QueuePtr; typedef stru
資料結構:實驗四棧和佇列的基本操作實現及其應用
一、實驗目的 1,熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2,學會使用棧和佇列解決實際問題。 二、實驗內容 1,自己確定結點的具體資料型別和問題規模: 分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。 分別建立一個順
迴圈線性佇列的基本操作(帶實驗資料)
#include <iostream> #include <cstring> using namespace std; bool overflow=0; struct Queue { int date[300]; int head; int tail; int le
資料結構實驗之棧與佇列八:棧的基本操作
Problem Description 堆疊是一種基本的資料結構。堆疊具有兩種基本操作方式,push 和 pop。push一個值會將其壓入棧頂,而 pop 則會將棧頂的值彈出。現在我們就來驗證一下堆疊的
資料結構實驗之棧與佇列八:棧的基本操作(new)
#include <stdio.h> #include <stdlib.h> typedef struct node { int *base; int *top; int stacksize; } sqstack;
實驗四 二叉樹基本操作的實現
實現鏈式儲存建立,遞迴先序 中序 後序遍歷,葉子結點數,數的結點總數,交換左右子樹 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int cnt; //結點宣告,資
實驗三 棧和佇列的基本操作實現及其應用
#include using namespace std; struct Node{ int data; Node *next; }; class QueueOfCanteen{ private: Node *front,*rear; int total; //計算當前排隊人數,並作為入隊單號的參
實驗三:棧和佇列的基本操作實現及其應用——順序棧
一、實驗目的1、 熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。2、 學會使用棧和佇列解決實際問題。二、實驗內容1、自己確定結點的具體資料型別和問題規模:分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。分別建立一個順序佇列和鏈佇列,實
實驗4:棧和佇列的基本操作實現及其應用——鏈棧
一、實驗目的 1、 熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2、 學會使用棧和佇列解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模: 分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。 分別建
實驗4:棧和佇列的基本操作實現及其應用之《順序佇列》
實驗4:棧和佇列的基本操作實現及其應用之順序佇列 一、實驗目的 1、 熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2、 學會使用棧和佇列解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模: 分別建立一個順