資料結構 棧和佇列

2021-09-28 22:23:39 字數 3716 閱讀 4816

棧的邏輯結構:棧是限定僅在表頭和表尾進行插入和刪除操作的線性表

允許插入的一端稱為棧頂,另一端為棧底

棧的**實現:

首先我們先考慮一下順序儲存結構的棧

#includeconst int maxsize=100;

using namespace std;

template class seqstack

;template void seqstack::push(t x)

template bool seqstack::empty()//判斷棧是否為空返回為真,否則返回假

template//取棧頂函式,返回棧頂的值

t seqstack::gettop()

templatet seqstack::pop()//出棧操作 }

int main()

#includeusing namespace std;

const int stack_size=100;//建立倆棧共用陣列空間大小

templateclass bothstack

;/*插入函式如果棧滿則丟擲異常;

判斷是插在棧1還是棧2

若插在棧1則

top1+1;

top1處填入x;

若插入在棧2

則top2+1;

top2處填入x;

函式實現:*/

templatevoid bothstack ::push(int i,t x)

/*刪除函式pop

若是在棧1中刪除,則若棧1為空棧,則丟擲異常

刪除並返回棧1棧頂元素

若是在棧2中刪除,則若棧2為空棧,則丟擲異常

刪除並返回棧2的棧頂元素*/

templatet bothstack::pop(int i)

if(i==2)

}/*判斷某個棧空演算法*/

templatebool bothstack::empty(int i)

if(i==2)

}/*取棧頂元素的演算法*/

templatet bothstack::getpop(int i)

if(i==2)

}int main()

棧的鏈式儲存結構實現

```cpp

#includeusing namespace std;

template struct node

; templateclass linkstack

~linkstack();

void push(t x);

t pop();

t gettop();

bool empty();

};typename void linkstack::push()

templatet linkstack::pop()

template linkstack::~linkstack()

}

順序棧和鏈棧的比較

時間效能:

相同都是常數時間o(1);

空間效能:

順序棧:有元素個數的限制和空間的浪費問題。

鏈棧:沒有棧滿的問題,只有當記憶體沒有可用的空間時才會出現棧滿,但是每個元素都需要乙個指標域,從而產生了結構性的開銷。

結論:當棧的使用過程個數變化較大時,用鏈棧合適。

佇列的邏輯結構

佇列:只允許在一端進行插入操作,而另一端進行刪除操作的線性表。

空佇列不含有任何元素。

允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。

佇列的操作特性:先進先出。

佇列的抽象資料型別定義

adt queue

data

佇列中元素具有相同型別及先進先出的特性,相鄰元素具有前驅和後繼的關係

operation

initqueue

前置條件:佇列不存在

輸入:無

功能:初始化佇列

輸出:無

後置條件:建立乙個空佇列

dequeue

前置條件:佇列已存在

輸入:無

功能:刪除對頭元素

輸出:如果刪除成功,返回被刪元素的值

後置條件:如果刪除成功,隊頭減少乙個元素

getqueue

前置條件:佇列已存在

輸入:無

功能:讀取隊頭元素

輸出:若佇列不空,返回隊頭元素

後置條件:佇列不變

empty

前置條件 :佇列已存在

輸入:無

功能:判斷佇列是否為空

輸出:若隊列為空返回1,否則返回0;

後置條件 :佇列不變

endadt

設定隊頭隊尾兩個指標

隊頭指標指向隊頭元素的前乙個位置;

隊尾指標指向隊中最後乙個元素;

整個佇列向陣列下標比較大的方向移動,單向移動。

假溢位:當元素被插入到陣列中下標最大的位置上之後,佇列的空間就用盡了,儘管此時陣列的低端還有空閒空間,這種現象叫做假溢位。

#include

using

namespace std;

const

int queuesize=

100;

template

<

class

t>

class

cirqueue

;bool cirqueue

::empty()

template

<

class

t>

void cirqueue

::enqueue

(t x)

template

<

class

t>

t cirqueue

::dequeue()

template

<

class

t>

t cirqueue

::getqueue()

template

<

class

t>

int cirqueue

::getlength()

#include

using

namespace std;

const

int queuesize=

100;

template

<

class

t>

template

<

typename t>

struct node

;template

<

class

t>

class

linkqueue

;template

<

class

t>

linkqueue

::linkqueue()

template

<

class

t>

void linkqueue

::enqueue

(t x)

template

<

class

t>

t linkqueue

::dequeue()

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...

資料結構 棧和佇列

本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...

資料結構 棧和佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution int pop node stack2.top stack2.pop return node private stack stack1 stack stack2 大家都知道斐波那契數列,現...