日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++练习11: 栈 和队列

發布時間:2023/12/20 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++练习11: 栈 和队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

棧(stack) : 具有先進后出,后進先出的特點。

  • C++ Stack(堆棧) 是一個容器類的改編,為程序員提供了堆棧的全部功能,——也就是說實現了一個先進后出(FILO)的數據結構。
empty() 堆棧為空則返回真 pop() 移除棧頂元素 push() 在棧頂增加元素 size() 返回棧中元素數目 top() 返回棧頂元素

C++ stack 的棧是不能遍歷的

  • 隊列(Queue) : 具有先進先出的特點。
q.empty() 如果隊列為空返回true,否則返回false q.size() 返回隊列中元素的個數 q.pop() 刪除隊列首元素但不返回其值 q.front() 返回隊首元素的值,但不刪除該元素 q.push() 在隊尾壓入新元素 q.back() 返回隊列尾元素的值,但不刪除該元素

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的順序是相反的
解題思路: 通過兩個棧,互相傾倒的方式,當一個棧的元素,傾倒另一個棧上,從而使得原來棧中最后出棧的元素最先出棧,從而顛倒了出棧的順序。

class Queue { private: stack<int> inputStack; stack<int> outputStack; public: void enqueue(int); int dequeue(); ];void Queue::enqueue(int value) {inputStack.push(value); }int Queue::dequeue() {int value;if(!outputStack.empty()){value=outputStak.top();outputStack.pop();return value;}while(!inputStack.empty()){.outputStack.push(inputStack.top())inputStack.pop();}value=outputStack.top();outputStack.pop();return value; }

題目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: 栈 和队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。