資料結構與演算法《棧》

2021-07-01 21:46:40 字數 2166 閱讀 3189

概念:

棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素,棧也稱為後進先出表

特點:

1. 棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指標;

2. 限定性資料結構;

3. 棧可以用來在函式呼叫的時候儲存斷點,做遞迴時要用到棧。

種類:

棧可以用兩種方式來實現,一種方法是用陣列實現棧,這種棧成為靜態棧;另外一種方法是用鍊錶實現棧,這種棧叫做動態棧

運算:

1. 設定乙個空棧;

2. 插入乙個新的棧頂元素;

3. 刪除棧頂元素;

4. 讀取棧頂元素;

5. 凡是對資料處理具有「後進先出」的特點,都可以用棧來操作。

儲存結構(順序棧、鏈棧):

1.順序棧:用一組連續的儲存單元存放從棧底到棧頂的資料元素,一般用一維陣列表示,設定乙個簡單變數top指示棧頂位置,稱為棧頂指標,它始終指向待插入元素的位置。

棧的上溢:

棧滿時(top = stacksize),還有元素要進棧。

棧的下益:

棧空時(top = 0),還有元素要出棧。

2.鏈棧:用指標實現的棧叫鏈棧,棧的容量事先不能估計時採用的資料結構。

靜態棧實現(c++):

stacklz.hxx檔案

#ifndef stacklz_hxx

#define stacklz_hxx

#include

template

class stacklz ;

template

unsigned stacklz::stacklength() const

template

stacklz::stacklz():numelems(0)

template

void stacklz::push(t const &elem)

elems[numelems] = elem; // 附加元素

++numelems; // 增加元素的個數

}template

void stacklz::pop()

--numelems; // 減少元素的個數

}template

t stacklz::top() const

return elems[numelems-1]; // 返回最後乙個元素

}template

bool stacklz::isempty() const

template

bool stacklz::isfull() const

#endif

main.cpp檔案

#include 

#include

#include

#include "stacklz.hxx"

using

namespace

std;

int main(int argc, char **argv)

catch (exception const &ex)

}

ps:使用非型別類模板自定義棧,且所有演算法的時間複雜度都為o(1)。

棧的應用:

1. 子程式的巢狀呼叫;

2. 函式的遞迴實現;

3. 字尾表示式求值;

4. 中綴表示式轉換成字尾表示式;

5. 二叉樹非遞迴遍歷;

6. 不勝列舉…=_=

棧(資料結構與演算法)

給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 tr...

資料結構與演算法 棧

後進先出 lifo last in first out 最後插入的元素最先出來,是一種 操作受限 的線性表,只允許在端插入和刪除資料 順序棧 用陣列實現,順序棧需要動態擴容,在初始化時需要給定乙個固定大小的陣列,當棧大於固定大小時需要擴充陣列的大小。templateclass myarraystac...

資料結構與演算法 棧

棧的介紹 棧是乙個先入後出的有序列表。棧頂 變化的一端,包括插入和刪除 棧底 固定的一端 棧的應用場景 1 子程式的呼叫 在跳往子程式前,會將下個指令的位址存到堆疊中,直到子程式執行完後再將位址取出,以回到原來的程式中。2 處理遞迴呼叫 和子程式呼叫類似,除了儲存下個指令的位址,也將引數 區域變數等...