1. 程式人生 > >資料結構之迴圈佇列和棧的應用

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

前面提到,在佇列的順序儲存結構中,必須要討論順序佇列的陣列越界(或上溢)問題。

根據順序佇列的定義,我們可以很輕鬆的發現,當佇列刪除一個元素之後,即front指標向後移動之時,往往這個時候就有可能出現所謂的“假溢位”現象,即可能會出現下圖所示這般:

這裡寫圖片描述

解決“假溢位”的辦法有很多,其中最為出色的是這四種方法:
一、採用迴圈佇列
二、按最大可能的進隊操作次數設計順序佇列的最大元素個數
三、修改出隊演算法,使得每一次出佇列後都把佇列中剩餘的元素向對頭方向移動一個位置
四、修改入隊演算法,增加判斷條件,當假溢位時,把佇列中的元素向對頭移動,然後完成入隊操作

然而,最常用的方法是:迴圈佇列

迴圈佇列是將儲存佇列的儲存區域看成一個首位相連的圓環,即將q->data[0]q->data[max-1]連線起來,形成一個環形表。
入隊操作時:隊尾指標加1,描述為q->rear=(q->rear+1)%max;
出隊操作時:對頭指標加1,描述為q->front=(q->front+1)%max;
然而使用迴圈佇列急需解決的一個問題就是:
當隊空的時候:q->front=q->rear;
當隊滿的時候:q->front=q->rear;
說白了,無法區分到底什麼時候隊滿和隊空。

於是解決辦法有三種:
一、使用變數(假設為a)計數,入隊a+1,出隊a-1,隊空條件(a==0),隊滿條件(a>0&&q->rear=q->front)

二、設定一個標誌位flag,入隊則flag=1;出隊則flag=0;若隊滿則:(q->front=q->rear&&flag==1),若隊空則(q->front=q->rear&&flag==0)

三、損失一個空間不用,即front所指處不用,當佇列元素為max-1時即認為滿了,此時隊空(q->front=q->rear),隊滿(q->front=(q->rear+1)%max

其中第三種辦法是最為熟悉的.
q->rear>=q->front時,迴圈佇列的長度len=q->rear-q->front;


q->rear<q->front時,len=q->rear-q->front+max;

彙總:
迴圈佇列的初始化條件:q->rear=q->front=0;
迴圈佇列滿條件:(q->rear+1)%max=q->front;
迴圈佇列空條件:q->front=q->rear

迴圈佇列依舊是順序佇列,除了邏輯上不同之外,其餘的都是非常的清楚,故迴圈佇列的操作的綜合程式與順序佇列的非常相似,若有所需要,可檢視博文-順序佇列,在此不再贅述。

棧的應用

用非遞迴演算法將輸入的任意一個十進位制整數轉換為八進位制數。

解題思路
這個題目相對簡單,放在棧的應用十分合適,將十進位制除以8的餘數壓入棧中,所得商重複上述動作,直至商為0.

程式碼

#include<stdio.h>
#define max 100
typedef struct
{
    int data[max];
    int top;
}seqstack;
void initstack(seqstack*s)
{
    s->top=0;
}
int gettop(seqstack*s)
{
    int x;
    if(s->top==0)
    {
        printf("the stack is empty\n");
        x=0;
    }
    else x=(s->data)[s->top];
    return x;
}
int push(seqstack*s,int x)
{
    if(s->top==max)
    {
        printf("the stack is full\n");
        return 0;
    }
    else
    {
        s->top++;
        (s->data)[s->top]=x;
        return 1;
    }
}
int pop(seqstack*s)
{
    int x;
    if(s->top==0)

    {
        printf("the stack is empty\n");
        x=0;
    }
    else {
        x=(s->data)[s->top];
        s->top--;
    }
    return x;
}
int main() 
{
    seqstack stack,*s;
    int n=0;
    s=&stack;
    initstack(s);
    printf("input a non number(decade):");
    scanf("%d",&n);
    push(s,'$');
    while(n!=0)
    {
        push(s,n%8);
        n/=8;
    }
    printf("the octal number:");
    while(gettop(s)!='$')
    printf("%d",pop(s));
    putchar('\n');
    return 0;
}

這裡寫圖片描述

總結

這次滿打滿算,收穫頗豐,除了知曉了佇列的奧妙,順便還體驗了一把棧的應用,從中我們可以看出,基本的思想時相對簡單的,難的就是如何將思想轉換為語言來形容,這是初級開發者的表現,爭取再進一步,成為以思想著稱的高階開發者!

相關推薦

資料結構迴圈佇列應用

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

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

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

資料結構__Python實現佇列

注:以棧為例,因為佇列只要修改popit()函式處程式碼,和修改相關提示語句即可。 #Python的棧定義與計基本操作 #佇列只是改下提示語句和popit()函式 stack=[] def pushit(): stack.append(input('輸入新的元素併入棧:').stri

資料結構迴圈佇列

懶癌患者迴圈佇列的基本操作實現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

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

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

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

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

c++STL 資料結構queue佇列應用

規則: 先進先出!!!1.queue 的基本操作有:入隊,如例:q.push(x); 將x 接到佇列的末端。出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。訪問隊尾元素,如例:

資料結構迴圈佇列(一)設定一個標誌域後的入佇列佇列的演算法

如果希望迴圈佇列中的元素都能得到利用,則需設定一個標誌域tag,並以tag的值為0或1來區分,尾指標和頭指標值相同時的佇列狀態是"空"還是"滿"。試編寫與此結構相應的入佇列和出佇列的演算法。 本題的迴圈佇列CTagQu

資料結構迴圈佇列的認識基本操作

迴圈佇列初始條件:隊頭指標(front)=隊尾指標(rear)=0 迴圈佇列隊滿條件:(rear+1)%size == front        (size是順序表的最大儲存空間) 迴圈佇列空條件:隊頭指標(rear)=隊尾指標(front) 隊頭指標向前移動計算:隊頭指標=(rear+1)%size    

軟考:資料結構基礎——迴圈佇列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

python資料結構串——概述基本演算法

概述: 字串(string)簡稱串,也是一種線性結構。在python中和array差不多,因為py的陣列也可以包括各種字元(在C/Java一類的語法中,陣列必須是同一種資料型別的元素)。線性結構,有限序列,是主要特點。串其中可以包含各種元素,也是計算機主要處理的一類物件。因

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

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

資料結構迴圈佇列

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

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

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

資料庫索引背後的資料結構B-樹B+樹

前言:索引結構有B樹索引、Hash索引、Fulltext索引等,關於樹結構的索引又分為B-Tree、B+Tree、B*Tree、R樹、R+樹等。本文重點探討B樹的前兩種結構。 資料庫查詢為什麼要使用索引   從理論上講,假設資料庫中的某一個表有10