資料結構(3) 棧

2021-09-03 01:55:00 字數 1918 閱讀 5704

0.目錄

1.線性表 – 陣列

2.線性表 – 單向鍊錶

3.棧棧是一種比較常見的資料結構,是一種較為特殊的線性表。對於棧來說,插入、刪除、訪問元素只能在棧頂進行

對棧的基本操作有push(進棧)、pop(出棧)和peek(查詢棧頂)。基於這種特性,棧又叫做lifo(last in first out)表,即後進先出

因為棧的本質是乙個線性表,所以任何實現線性表的資料結構都能實現棧。jdk中的類stack是繼承類vector。現在我們使用前兩節的array類和linked類來分別實現棧的常用方法。

我們先對棧的常用方法定義成介面,介面類如下:

public inte***ce stack
由於動態陣列array對陣列尾端的增刪改查的時間複雜度為o(1),因此使用array類實現棧,應當將陣列尾端作為棧頂,則push、pop、peek方法的時間複雜度也是o(1)。

實現**如下:

public class arraystackimplements stack

public arraystack(e e)

@override

public boolean isempty()

@override

public int getsize()

@override

public void push(e e)

@override

public e pop()

@override

public e peek()

@override

public int search(e e)

@override

public string tostring()

} return sb.tostring();

}}

由於單鏈表linked對鍊錶首端的增刪改查的時間複雜度為o(1),因此使用linked類實現棧,應當將單鏈表首端作為棧頂,則push、pop、peek方法的時間複雜度也是o(1)。

實現**如下:

public class linkedstackimplements stack

public linkedstack(e e)

@override

public boolean isempty()

@override

public int getsize()

@override

public void push(e e)

@override

public e pop()

@override

public e peek()

@override

public int search(e e)

@override

public string tostring()

}

對於array實現的棧和linked實現的棧來說,push、pop、peek操作時間複雜度都是o(1)級別,因此效能上不會有量級的差別。但在實際使用中,還是會有一些區別。原因在於array類會有resize操作(擴容、縮容),每一次resize都會消耗o(n)的時間複雜度來重新開闢一整塊記憶體空間以及複製元素(均攤下來則是o(1));而linked類雖然不需要resize,但是每一次新加入元素都需要開闢一小塊記憶體空間存放節點。具體哪種方式效率高,取決於多種因素(作業系統、cpu等),因此不在本節討論範圍之內。

資料結構3 棧

2 2 鏈式棧儲存結構與基本運算 3 棧的應用 棧 stack 限定在棧頂 表尾 進行插入 入棧 和刪除 出棧 的線性表。基操作的特性是先進後出,又稱為 後進先出 last in first out,lifo 的線性表。根據棧的設計儲存結構的不同,一般分也順序棧和鏈式棧,對應的基本運算操作也有所不同...

資料結構3 棧

pragma once include include include include using namespace std 棧的典型應用 1 有明確演算法解決乙個問題,但是問題的解卻以線性序列的形式給出。2 無論是遞迴還是迭代實現,該線性序列都是以逆序計算輸出的。3 輸入輸出規模不確定,難以事先...

資料結構3 棧

2 2 鏈式棧儲存結構與基本運算 3棧的應用 棧 stack 限定在棧頂 表尾 進行插入 入棧 和刪除 出棧 的線性表。基操作的特性是先進後出,又稱為後進先出 last in first out,lifo 的線性表。根據棧的設計儲存結構的不同,一般分也順序棧和鏈式棧,對應的基本運算操作也有所不同。棧...