Java的順序棧和鏈式棧

2021-08-19 17:19:05 字數 3438 閱讀 2184

棧是限制在表的一段進行插入和刪除的運算的線性表,通常能夠將插入、刪除的一端為棧頂,例外一端稱為棧底,當表中沒有任何元素的時候稱為空棧。

通常刪除(又稱「退棧」)叫做彈出pop操作,每次刪除的都是棧頂最新的元素;每次插入(又稱「進棧」)稱為壓入push操作。

當棧滿的時候,進行push 操作,會上溢,當空棧的時候進行退棧操作的時稱為下溢

上溢是一種出錯的情況,下溢可能是正常的情況處理。

堆疊的運算是按照後進先出的原則,簡稱lifo

棧的基本運算定義:

* initstack:構造乙個空棧;

* stackempty:判斷是否為空;

* stackfull:判斷是否棧滿;

* push:進棧,將該元素壓入棧頂;

* pop:退棧,彈出棧頂元素,注意非空判斷;

* stacktop:去除棧頂元素,不改變指標。

做個簡單的stack介面:

package com.wuwii.utils;

/** * 堆疊

*@author zhang kai

*@version 1.0

*@since2017/12/14 22:51

*/

public

inte***ce

stack

就是符合lifo運算規則的順序線性表。

package com.wuwii.utils;

/** * 順序棧

*@author zhang kai

*@version 1.0

*@since2017/12/14 23:05

*/

public

class

arraystack

implements

stack

/**

* 初始化指定大小的棧

*@param givensize 指定棧大小

*/public

arraystack(integer givensize)

/*** 初始化棧

*@param givensize 給定的棧大小

*/private

void

initstack(integer givensize)

/*** 清空棧

*/@override

public

void

clear()

/*** 進棧

*@param element 進棧的元素

*/@override

public

void

push(e element)

/*** 彈出棧頂元素 ,並改變指標

*@return 棧頂元素

*/@override

public e pop()

/*** 返回棧頂元素 ,不改變指標

*@return 棧頂元素

*/@override

public e topelement()

/*** 判斷是否為空棧

*@return true為空棧

*/@override

public boolean isempty()

/*** 在進棧的時候檢查

*/private

void

sizecheckforpush()

}/**

* 退棧檢查

*/private

void

sizecheckforpop()

}}符合lifo運算規則的鏈式線性表。

package com.wuwii.utils;

/** *@author zhang kai

*@version 1.0

*@since2017/12/15 12:58

*/

public

class

linkstack

implements

stack

/**

* 初始化

*/private

void

initstack()

/*** 儲存單元

*/private

static

class

node }

/*** 進棧

**@param element 進棧的元素

*/@override

public

void

push(e element)

/*** 彈出棧頂元素 ,並改變指標

**@return 棧頂元素

*/@override

public e pop()

/*** 返回棧頂元素 ,不改變指標

**@return 棧頂元素

*/@override

public e topelement()

/*** 判斷是否為空棧

**@return true為空棧

*/@override

public boolean isempty()

/*** 清空棧

*/@override

public

void

clear()

for (nodex = top; x != null; )

size = 0;

}/**

* 檢查鏈式堆疊是否為空,為空丟擲異常

*/private

void

checkempty()

}}

首先push 修改新產生的鍊錶節點的next 域並指向棧頂,然後設定top 指向新的鍊錶節點,pop則相反。

實現鏈式棧和順序棧的操作都是需要常數時間,時間複雜度為o(1),主要從空間和時間複雜度考慮。

順序棧初始化的時候必須要給定指定大小,當堆疊不滿的時候,會造成一部分的空間浪費,鏈式棧變長,相對節約空間,但是增加了指標域,額外加大了資料結構的開銷。

當需要多個堆疊共享的時候,順序儲存中可以充分的利用順序棧的單向延伸,將乙個陣列可以存在兩個堆疊裡,每個堆疊從各自的棧頂出發延伸,這樣減少了空間的浪費。但只有兩個為堆疊的空間有相反的需求的時候才能使用。就是最好乙個堆疊只能增加,乙個只能減少。如果,兩個一起增加,可能造成堆疊的溢位。

如果在多個順序堆疊共享空間,乙個堆疊滿了,其他可能沒滿,需要使用堆疊的lifo 運算法則,將滿的堆疊元素向左或者右進行平移操作,這樣會造成大量的資料元素移動,使得時間的開銷增大。

相對來說,使用兩個堆疊共享乙個空間是比較適宜的儲存方式,但是也增加了堆疊溢位的危險。

由於鏈式儲存結構的不連續性,什麼時候需要,就什麼時候去儲存,不存在溢位的問題,但是增加了結構的開銷,總體上來說浪費了空間,但是不需要堆疊共享,

順序棧和鏈式棧

順序棧 採用順序儲存結構的棧 push pop peek 方法的時間複雜度為o 1 當需要擴充棧容量時push 方法的時間複雜度為o n package com.lzw.demo.stacktest public inte ce sstack package com.lzw.demo.stackte...

順序棧和鏈式棧

相信大家對棧都不陌生,棧作為一種基礎的資料結構,在很多地方都會用到,在這裡整理一下順序棧和鏈式棧的一些基礎操作。pragma onc define max size 10 class seqstack seqstack 判斷棧滿 bool full 判斷棧空 bool empty 入棧 void p...

棧 順序 鏈式 java實現

棧的定義 棧 stack 是限制僅在表的一端進行插入和刪除運算的線性表。1 通常稱插入 刪除的這一端為棧頂 top 另一端稱為棧底 bottom 2 當表中沒有元素時稱為空棧。3 棧為後進先出 last in first out 的線性表,簡稱為 lifo 表。棧的修改是按後進先出的原則進行。每次刪...