1. 程式人生 > >資料結構之迴圈佇列

資料結構之迴圈佇列

懶癌患者敲打敲打

迴圈佇列的基本操作實現

1.構造迴圈佇列原因:佇列初始化時,令front=rear=0,每當插入一個元素時,“尾指標加1”;

刪除一個元素時,“頭指標加1”(注意指標都是加一)。

因此,在非空佇列中,頭指標始終指向佇列的頭元素,二尾指標始終指向佇列的尾元素。

當刪除一定量的元素後,隊首則放空,而隊尾若到達了邊界值,則無法繼續入隊,這種情況下,造成了空間的浪費。

所以一個巧妙的方法就是,構造一個迴圈佇列,充分利用空間。

2.迴圈佇列判空、滿的解決:

由於佇列的判空或滿的情況衝突,因此採用以下兩種方法來解決這種問題:

(1)另外設定一個標誌位以區別佇列是“空”還是“滿”;

(2)少用一個元素空間,約定“當佇列頭指標在佇列尾指標的下一位(指環狀的下一個位置)”上作為佇列滿“滿”的標誌。 

即當佇列是空的時候 滿足條件Q.front==Q.rear;當佇列滿的時候滿足條件(Q.rear+1)%MAXSIZE == Q.front。MAXSIZE指

代佇列的最大長度。

3.隊列當前長度的獲取:(Q.rear-Q.front+MAXSIZE)%MAXSIZE

4.迴圈基本操作佇列實現(C語言)

#include<iostream>
#include<cstdlib>
using namespace std;
#define MaxLength 100
typedef int Elemtype;
typedef struct {
    Elemtype *base;//初始化的動態分配儲存空間
    int front;//頭指標,若佇列不空,則指向佇列的頭元素
    int rear;//尾指標,若佇列不空,指向隊尾元素的下一個位置
}SqQueue;

/*迴圈佇列基本操作的實現*/

//1.初始化,構造一個空佇列
int init(SqQueue &Q){
    Q.base = (Elemtype *)malloc(MaxLength*sizeof(Elemtype));//申請記憶體空間,其型別為Elemtype
    if(!Q.base) exit(0);
    Q.front = Q.rear = 0; //初始化


    return 1;
}

//2.求迴圈佇列的長度
int length(SqQueue &Q){
    return (Q.rear-Q.front + MaxLength)%MaxLength;
}

//3.插入一個元素
int insertRear(SqQueue &Q,Elemtype e){
    if((Q.rear+1)%MaxLength == MaxLength){
        cout<<"佇列已滿";
        return 0;
    }
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear+1)%MaxLength;//隊尾指標進1

    return 1;
}

//4、刪除一個元素
int deleteFront(SqQueue &Q,Elemtype &e){
    if(Q.front == Q.rear){
        cout<<"佇列為空"<<endl;
        return 0;
    }
    e = Q.base[Q.front]; //選取隊首元素,用e返回其地址
    cout<<e<<" ";
    Q.front=(Q.front+1)%MaxLength;
    return 1;
}

int main(){
    SqQueue Q;
    init(Q);
    int i,n;
    Elemtype e;
    
    cout<<"請輸入佇列的元素(小於0則結束):"<<endl;
    while(1){
        cin>>e;
        if(e<0)break;
        cout<<"輸入下一個元素:"<<endl;
        insertRear(Q,e);
    }
    
    int len = length(Q);
    cout<<"刪除所有元素(列出佇列的所有元素)"<<endl;
    for(int i=0;i<len;i++){
        deleteFront(Q,e);
    }
    
    //在執行一次刪除,出現異常
    deleteFront(Q,e);
    return 0;
}

相關推薦

資料結構迴圈佇列(SeqQueue)原始碼

SeqQueue.h檔案#pragma once #include<assert.h> #include<iostream> #define defaultSize 20 template<class T> class SeqQueu

資料結構迴圈佇列和棧的應用

前面提到,在佇列的順序儲存結構中,必須要討論順序佇列的陣列越界(或上溢)問題。 根據順序佇列的定義,我們可以很輕鬆的發現,當佇列刪除一個元素之後,即front指標向後移動之時,往往這個時候就有可能出現

資料結構迴圈佇列

懶癌患者迴圈佇列的基本操作實現1.構造迴圈佇列原因:佇列初始化時,令front=rear=0,每當插入一個元素時,“尾指標加1”;刪除一個元素時,“頭指標加1”(注意指標都是加一)。因此,在非空佇列中,頭指標始終指向佇列的頭元素,二尾指標始終指向佇列的尾元素。當刪除一定量的元

資料結構迴圈佇列(面向物件思想c++實現)

佇列是一種資料結構,它具有先進先出的特點,即FIFO(first in first out)。佇列一般有普通佇列和迴圈佇列兩種形式。我們用陣列來實現佇列,使用一般的普通佇列,當我們把隊頭元素out的時候,隊頭後的元素會逐一向前挪動,這樣就大大降低了處理效率。

PHP與資料結構迴圈佇列

<?php /* * use PHP to write queue * 佇列的順序結構(迴圈佇列,防止假溢位) */ class queue{ //儲存空間 private $data; /

JAVA資料結構迴圈佇列的實現

1、迴圈佇列CircleQueue類的實現程式碼如下所示: public class CircleQueue { private Object[] array; private int capac

資料結構順序佇列迴圈佇列

由於佇列有元素出列,front就向後移動,所以佇列前面的空間就空了出來。為了更合理的利用空間,人們想了一個辦法:將佇列的首尾相連線。這樣當rear移動到LENGTH時,會再從0開始迴圈。那當什麼時候佇列滿呢?當rear等於front的時候。可是佇列為空的時候也是同樣的條件

軟考:資料結構基礎——迴圈佇列C語言實現

  迴圈佇列得實現: 1.     在入隊和出隊時,我們通過      q->rear = (q->rear +1)%MAX_LENTH 來實現迴圈入隊     q

資料結構堆疊佇列(一)

目錄 資料結構值堆疊佇列           1.堆 2.棧  -- 作業系統在建立某個程序時或者執行緒為這個執行緒建立儲存區域 3.堆、棧區別總結: 4.佇列 5.堆、棧、佇列三者區別 

資料結構迴圈佇列的實現

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define TURE 1 #define FALSE 0 #de

Java版資料結構迴圈連結串列的實現

簡介 在指定結點後新增一個結點 刪除指定結點的下一個結點 獲取下一個結點 獲取結點資料 public class LoopNode { int data;//資料域 LoopNode next;//下一個結點 public Loop

資料結構迴圈佇列的應用(一)列印楊輝三角

列印楊輝三角 楊輝三角是比較常見的佇列的應用,下面一行的數是上面2個數字的和,數列首位都是1,高中數學裡牛頓二項式展開式應該有說。 程式碼收穫 這題主要是找規律。利用下面一行比上面一行數字多一個,佇列頭為上一行,除了入隊首尾的1之外,入隊的上一行2個數的和

資料結構迴圈佇列

上次實現了陣列佇列,這次來實現迴圈佇列 迴圈佇列的幾個要點,front指向隊頭元素,tail指向隊尾元素的下一個位置,front=tail時佇列為空,(front+1)% data.Length = tail時佇列為滿,還是會使用第一節所編寫的陣列類做最底層。

重讀資料結構優先順序佇列

佇列是一種先進先出的結構,但優先順序佇列需要對後擠進去的資料進行排序,如果足夠大的話會排至隊首。它可以用來維護一堆資料中最大(最小)的N個數據,在這裡用大頂堆(完全二叉樹)來實現不停輸入整數時找出K個最小的數,通過與堆頂的比較,決定是否頂替堆頂並再次排序。這也是為了給KD樹求

資料結構迴圈佇列的清空、銷燬、求隊長、遍歷、取首元素等操作及運用

資料結構中佇列有好幾種形式,本文寫的是迴圈佇列,以下為原創程式碼。建立c++工程: 標頭檔案一:基本定義和標頭檔案 #include"stdlib.h" #include"stdio.h" #define MAXQSIZE 100 #define OK 1 #defin

資料結構迴圈佇列(C語言實現)

生活中有很多佇列的影子,比如打飯排隊,買火車票排隊問題等,可以說與時間相關的問題,一般都會涉及到佇列問題;從生活中,可以抽象出佇列的概念,佇列就是一個能夠實現“先進先出”的儲存結構。佇列分為鏈式佇列和靜態佇列;靜態佇列一般用陣列來實現,但此時的佇列必須是迴圈佇列,否則

西北工業大學NOJ資料結構—009迴圈佇列

本題為迴圈佇列的應用,所謂迴圈佇列,就......迴圈的佇列 唄迴圈佇列可以在有限的佇列空間,來回進隊列出佇列,可以節約大量的儲存空間——因為佇列只能從一端進入從另一端彈出,所以若是進進出出(滑稽),就會使彈出佇列的元素原來佔有的位置不能再次被利用但是由於要求使用rear隊尾

資料結構單鏈佇列(鏈式儲存佇列)的實現(C語言)

學習參考: 嚴蔚敏: 《資料結構-C語言版》 基本操作 入隊 出隊 建空佇列 判隊空 獲取隊首元素 獲取佇列長度 清空佇列 程式碼實現 佇列結點定義 typedef stru

java資料結構迴圈單鏈表

直接上程式碼舉例說明: public class CircularLinkedList { //java中迴圈單鏈表 private class Node {//建立一個內部節點類 private Node next = null; private Objec

資料結構迴圈單鏈表(C++實現)

基本的概念與連結串列相同,不同的是 最後一個鏈結點的指標指向頭部 形成了迴圈連結串列#include <iostream> using namespace std; class Node { public: Node *next; int data;