資料結構與演算法之棧

2022-06-06 15:15:09 字數 2021 閱讀 3855

棧是一種資料結構, 滿足先入後出.

一般棧支援以下幾個操作:

push(n);    //資料入棧

a.pop(); //資料出棧

a.top(); //獲取棧頂元素

a.size(); //獲取棧中元素數量

a.empty(); //是否是空棧

官方文件中, 定義如下

template<

class t,

class container = std::deque> class stack;

std::stack是乙個c++模板類, 有兩個模板引數t和container, t代表容器元素的資料型別, container則代表stack使用的容器, 預設使用std::deque這個容器. 這意味著, stack相當於是對已有容器的改裝, 也可以使用使用者自定義的容器.

container必須提供以下幾種方法:

支援back();

支援pop_back();

支援push_back();

相當於都是往container的後面塞入或者彈出資料, 也就是container也需要滿足的stack的基本功能.

因此, 我們將自定義或者其他c++標準容器轉換為stack容器. 以下是官方的demo, 我新增了vector的轉換以加強理解.

#include #include #include #include int main()

; std::stackc3(deq); //stack的container預設就是deque, 所以無需再次宣告

std::cout << c3.size() << '\n';

// int ds[3] = ; //使用陣列是不行的, 因為普通陣列沒有實現container要求的操作

std::vectords ;

std::stack> c4(ds); //vector不是stack預設的container型別, 所以需要宣告

std::cout << c4.size() << '\n';

}

括號匹配問題一般描述是:

給定乙個字串s, 其中包含'{}'/''/'()'三種括號對, 例如s1 = "{}({})", s2 = ")", 其中s1是合法的, s2是不合法的. 設計乙個函式, 判斷輸入的僅包含括號字元的字串是否合法.

bool isbracketok(const string &s)

, ,

'}};

auto is_match = [=] (const char &a, const char &b) -> bool

}return match;

};auto is_left = [=] (const char &a) -> bool

}return false;

};auto is_right = [=] (const char &a) -> bool

}return false;

};stackss;

for (const char &c : s)

else

}else

if (is_right(c))

else}}

}return ss.empty();

}

我們先定義一些函式, 用於判斷給定字元是不是括號, 是左括號還是右括號, 判斷給定字元對是不是匹配的括號.

對待判斷的字串, 如果是左括號則入棧, 如果是右括號, 則從判度棧頂字元和當前字元是不是匹配的括號對, 並彈出;

曾經有一段時間, 我堅信乙個函式應該且必須只有乙個return.

但是漸漸也發現這樣做的弊端, **會需要重構, 可能會有很多的臨時變數, 也可能會有很深的巢狀邏輯, 而且多個return的可讀性也不差.

所以, 乙個函式該不該有多個return呢? 還有待更多的經驗積累, 不能聽風就是雨.

《資料結構與演算法》之棧

資料結構與演算法 之鍊錶 資料結構與演算法 之佇列 資料結構與演算法 之排序 資料結構與演算法 之二分查詢 資料結構與演算法 之二叉樹 關於 棧 我有乙個非常貼切的例子,就是一摞疊在一起的盤子。我們平時放盤子的時候,都是從下往上乙個乙個放 取的時候,我們也是從上往下乙個乙個地依次取,不能從中間任意抽...

資料結構與演算法之棧

中綴表示式實現多位數的計算 實現 public class calculatordemo else 否則直接入符號棧 else 如果是數字直接入數棧 else else index if index expresion.length 表示式掃瞄完後就順序的從數棧和符號棧中pop出相應的數字和符號並執...

資料結構與演算法之棧

字首表示式 求值 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 棧頂元素 和 次頂元素 並將結果入棧 重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果 例如 3 4 5 6 對應的字首表示式就是 3 4 5 6 針對字首表示...