棧是一種資料結構, 滿足先入後出.
一般棧支援以下幾個操作:
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 針對字首表示...