線性表 佇列的陣列實現

2021-09-25 11:22:17 字數 3619 閱讀 6265

定義和應用

佇列(queue)是乙個線性表,其插入和刪除分別在表的不同端進行。它是一種先進先出(fifo)的線性表,插入元素的一端稱為隊尾(bakc或者rear),刪除元素的一段叫作隊首(front)。

以陣列來實現,需要考慮空間的利用率。如果採用類似陣列和棧一般的對映公式location(i)=i,那麼每次刪除陣列前端(隊首)元素需要將陣列整體左移一位,顯然效率低下。考慮新的對映公式location(i)=location(隊首元素)+i,能很好地解決這一問題,但同時也有了乙個新的問題,那就是在一系列的插入操作後,陣列前端(隊首位置)存在大量未使用的空位址,因此空間利用率低,如果將陣列中所有元素整體左移,那麼和剛才的方法一樣,時間複雜度又為漸近大於arraylength。

因此我們考慮將陣列視為環,來實現環形的佇列。環形陣列實現的佇列的對映公式為 location(i)=(location(隊首元素)+i)%arraylength 。環形佇列也有乙個問題,那就是queuefront==queueback時,到底是表示隊空還是隊滿呢?因此我們改變隊首元素指標queuefront的約定,讓他指向隊首元素的前乙個位置,這樣當且僅當queuefront==queueback時才表示隊空,而如果 (queueback+1)%arraylength==queuefront時,就需要加倍陣列並複製原有元素了。因此,該實現中,佇列的元素個數最多是arraylength-1個。

具體實現

queueadt.h

#pragma once

template

<

typename t>

class

queueadt

virtual

bool

empty()

const=0

;virtual size_t size()

const=0

;virtual t&

front()

const=0

;//返回隊首元素的引用

virtual t&

back()

const=0

;//返回隊尾元素的引用

virtual

void

pop()=

0;//在隊首刪除元素

virtual

void

push

(const t& _element)=0

;//在隊尾插入元素

};

queueempty.h

#pragma once

#include

using std::string;

#include

using std::cin;

using std::cout;

using std::cerr;

using std::ostream;

using std::istream;

using std::ends;

using std::endl;

class

queueempty

~queueempty()

string what()

const

void

output()

const

private

: string message;

};

queuearray.h

#pragma once

#ifndef queuearray_h

#define queuearray_h

#include

"queueadt.h"

#include

"queueempty.h"

template

<

typename t>

class

queuearray

:public queueadt

~queuearray()

bool

empty()

const

size_t size()

const

t&front()

const

; t&

back()

const

;void

pop();

void

push

(const t& _element)

;void

output()

;private

: t* queue;

//元素陣列

size_t capacity;

//佇列的容量capacity

size_t queuefront;

//隊首元素的前乙個位置的下標

size_t queueback;

//隊尾元素下標};

template

<

typename t>

inline t& queuearray

::front()

const

template

<

typename t>

inline t& queuearray

::back()

const

template

<

typename t>

inline

void queuearray

::pop()

template

<

typename t>

void queuearray

::push

(const t& _element)

else

//更新資料成員

queueback = capacity -2;

capacity *=2

; queuefront = capacity -1;

delete

queue;

queue = newqueue;

} queueback =

(++queueback)

% capacity;

queue[queueback]

= _element;

}template

<

typename t>

void queuearray

::output()

cout << endl;

}#endif

測試**

#include

"queuearray.h"

#include "..

//..//..//ch06/chainlist/chainlist/illegalparametervalue.h"

#include "..

//..//..//ch08/stack/stack/stackarray.h"

//***********************************test for queuearray***********************************

intmain()

trycatch

(const queueempty& e)

}

線性表 陣列實現

include include includeusing namespace std define ms a memset a,0,sizeof a define maxlength 100 線性表陣列實現,定義乙個具有兩個域結構體,陣列下標為0的地方不存放元素,可以使位置i對應整數i 第乙個域是陣...

線性表陣列實現

線性表 順序表示 用陣列實現,比較簡單 線性表的順序表示指的是用一組位址連續的儲存單元一次儲存線性表的資料元素,在高階語言程式設計中,陣列具有隨機訪問的特性,因此通常都用陣列來描述資料結構中的順序儲存結構,對於線性表,可以用一維陣列來實現 1 順序表的初始化 定義乙個object型別的陣列,可儲存任...

線性表的陣列實現

分別實現3種型別的鍊錶,這一篇用陣列來實現線性表 有序鍊錶 鍊錶元素或節點始終保持有序,鍊錶元素為comparable物件,主要體現在插入操作要插入在相應的序列位置 無序鍊錶 無序,每次指定插入在哪 表頭,尾,or指定元素之後 將三種實現的都有的公共操作定義在乙個介面adt中,對應於各自特徵所特有的...