概念:
棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素,棧也稱為後進先出表。
特點:
1. 棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指標;
2. 限定性資料結構;
3. 棧可以用來在函式呼叫的時候儲存斷點,做遞迴時要用到棧。
種類:
棧可以用兩種方式來實現,一種方法是用陣列實現棧,這種棧成為靜態棧;另外一種方法是用鍊錶實現棧,這種棧叫做動態棧。
運算:
1. 設定乙個空棧;
2. 插入乙個新的棧頂元素;
3. 刪除棧頂元素;
4. 讀取棧頂元素;
5. 凡是對資料處理具有「後進先出」的特點,都可以用棧來操作。
儲存結構(順序棧、鏈棧):
1.順序棧:用一組連續的儲存單元存放從棧底到棧頂的資料元素,一般用一維陣列表示,設定乙個簡單變數top指示棧頂位置,稱為棧頂指標,它始終指向待插入元素的位置。
棧的上溢:
棧滿時(top = stacksize),還有元素要進棧。
棧的下益:
棧空時(top = 0),還有元素要出棧。
2.鏈棧:用指標實現的棧叫鏈棧,棧的容量事先不能估計時採用的資料結構。
靜態棧實現(c++):
stacklz.hxx檔案
main.cpp檔案#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
ps:使用非型別類模板自定義棧,且所有演算法的時間複雜度都為o(1)。#include
#include
#include
#include "stacklz.hxx"
using
namespace
std;
int main(int argc, char **argv)
catch (exception const &ex)
}
棧的應用:
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 處理遞迴呼叫 和子程式呼叫類似,除了儲存下個指令的位址,也將引數 區域變數等...