C++练习11: 栈 和队列
介紹
棧(stack) : 具有先進后出,后進先出的特點。
- C++ Stack(堆棧) 是一個容器類的改編,為程序員提供了堆棧的全部功能,——也就是說實現了一個先進后出(FILO)的數據結構。
C++ stack 的棧是不能遍歷的
- 隊列(Queue) : 具有先進先出的特點。
stack
題目1:獲取stack中最大的元素
解題思路:使用2個stack,一個是常規的stack,另一個stack 存儲在比較過程中大的元素。
class stackWithMax { private:stack<int> valueStack;stack<int> maxStack;public:void push(int);int pop();int max(); };void stackWithMax::push(int value) {if(maxStack.empty() || maxStack.top() <=value){maxStack.push(value);}valueStack.push(value); }int stackWithMax::pop() {int value=valueStack.top();valueStack.pop();if(value == maxStack.top()){maxStack.pop()}return value; }int stackWithMax::max() {return maxStack.pop(); }題目2:通過stack 實現隊列Queue
我們知道stack輸出順序和queue的順序是相反的
解題思路: 通過兩個棧,互相傾倒的方式,當一個棧的元素,傾倒另一個棧上,從而使得原來棧中最后出棧的元素最先出棧,從而顛倒了出棧的順序。
題目3: 如何對Stack進行升序排列
解題思路:假設使用兩個Stack A 和 B ,隊列A中元素是沒有順序的,將隊列A中的元素有序的加入隊列B中,從隊列A中取一個元素,假設該元素不符合隊列B當前的排列順序,我們就取stackB上的元素,直到元素可以按順序入棧。
stack<int> sort(stack<int> &input) {stack<int> output;while(!input.empty()){int value=input.top();input.pop();while(!output.empty() && output.top <value){input.push(output.top())output.pop();}output.push(value);}return output; }“save or latter” 問題
有一類問題有這樣的特性:當前節點的解依賴后驅節點。
對于某一類當前節點,如果不能獲知后驅節點,就無法得到有意義的解。這類問題可以通過stack(或等同于stack的若干個臨時變量)
解決:先將當前節點入棧,然后看其后續節點的值,直到其依賴的所有節點都完備時,再從棧中彈出該節點求解。某些時候,甚至需要反復這個過程:將當前節點的計算結果再次入棧,直到其依賴的后續節點完備。
題目1:驗證括號的有效性
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意:空字符串可被認為是有效字符串
思路
由于要對照字符串對稱位置上的括號是否對應,決定采用棧來解決這一問題,若字符串長度不為偶數則直接返回false,遍歷字符串,讀到前括號時入棧,讀到后括號時若??談t返回false,若棧不空則用棧頂元素與其比較,能對應則出棧,不能則返回false。最后檢查???#xff0c;若空則返回true
代碼實現:
bool isLeftParentheses(char left,char right) {return input == '(' || input == '[' || input == '{'; }bool isMatchParentheses(char left,char right) {swithc(left){case '(':return right == ')';case '[':return right == ']';case '{':return right == '}';}return false; }bool isValidParentheses(string input) {stack<char> parenthesesStack;for(int i=0;i<input.length;i++){if(isLeftParentheses(input[i]))parenthesesStack.push(input[i]);else:{if (parenthesesStack.empty() || !isMatchParentheses(parenthesesStack.top(),inut[i])){return false;}else if(!parenthesesStack.empty() && isMatchParentheses(parenthesesStack.top(),inut[i]) ){parenthesesStack.pop();}else{return false;}}}return parenthesesStack.empty(); }代碼2
{ class Solution { public:bool isValid(string s) {if(s.size()%2!=0){return false;}stack <char>stk;for(int i=0;i<s.size();i++){if(s[i]=='('||s[i]=='{'||s[i]=='['){stk.push(s[i]);}else{if(stk.empty()){return false;}else{if(s[i]==')'&&stk.top()=='('){stk.pop();}else if(s[i]=='}'&&stk.top()=='{'){stk.pop();}else if(s[i]==']'&&stk.top()=='['){stk.pop();}else{return false;}}}}return stk.empty();} };}參考博客:C++有效的括號
用stack解決Top-Down結構的問題
所謂的Top-Down結構,從邏輯理解角度來看,實際上就是一種樹形結構,從頂層出發,逐漸向下擴散,例如二叉樹的周游問題。在實際運算的時候,我們先解決子問題,再利用子問題的結構解決當前問題。
由于Stack的LIFO特征,可以利用Stack數據結構消除遞歸。Recursion通常用函數調用自身實現,在系統調用的時候系統會分配額外的空間,并且需要用指針記錄返回的位置,故overhead比較大
題目1: 二叉樹的中序遍歷
中序遍歷:首先遍歷根結點的左子樹,然后訪問根結點,最后中序遍歷其右子樹。
未完待續。。。
總結
以上是生活随笔為你收集整理的C++练习11: 栈 和队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux suse11 sp3安装,S
- 下一篇: s3c2440移植MQTT