1. 程式人生 > >實驗四 佇列的基本操作

實驗四 佇列的基本操作

一、實驗目的

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、自己確定結點的具體資料型別和問題規模: 分別建立一個順