棧與隊列基礎知識

棧,是先進后出的線性表,標準STL的棧包括如下5種操作,設棧S:
1.取出棧頂元素:S.top();
2.判斷棧是否為空:S.empty();
3.將元素x添加至棧:S.push(x)
4.彈出棧頂:S.pop();
5.求棧存儲元素的個數(shù):S.size()

#include <stdio.h>
#include <stack>
int main(){
    std:: stack<int> S;
    if(S.empty()){
        printf("S is empty!");
     }
    S.push(5);
    S.push(6);
    S.push(10);
    printf("S.top = %d\n",S.top());
    S.pop();
    S.pop();
    printf("S.top = %d\n",S.top());
    printf("S.size = %d\n",S.size());
    return 0;
}

隊列

隊列,是先進先出的線性表,標準STL的隊列包括如下6種操作,設隊列Q:
1.判斷隊列是否為空:Q.empty();
2.返回隊列頭部元素:Q.front();
3.返回隊列尾部元素:Q.back()
4.彈出隊列頭部元素:Q.pop();
5.將元素x添加至隊列:Q.push(x);
6.求隊列存儲元素的個數(shù):Q.size()

# include <stdio.h>
# include <queue>
int main(){
    std::queue<int> Q;
    if(Q.empty()){
        printf("Q is empty!\n");
    }
    Q.push(5);
    Q.push(6);
    Q.push(10);
    printf("Q.front = %d \n",Q.front());
    Q.pop();
    Q.pop();
    printf("Q.front = %d \n",Q.front());
    Q.push(1);
    printf("Q.back = %d \n",Q.back());
    printf("Q.size = %d\n",Q.size());
    return 0;
    
}

1.使用隊列實現(xiàn)棧

LeetCode 225. Implement Stack using Queues
設計一個棧,支持如下操作,棧的內部存儲數(shù)據的結構為隊列,隊列的方法只 能包括push、peek(front)、pop、size、empty等標準的隊列方法。

class MyStack{
public:
    MyStack(){
}
    void push(int x){
}
    int pop(){
}
    int top(){
}
    bool empty(){
}        
};
算法設計,push時調整

普通隊列實現(xiàn)棧stack,內部存儲結構時隊列Queue:


#include<queue>
class Mystack{
public:
    Mystack(){}
    void push(int x){
        std::queue<int> temp_queue;
        temp_queue.push(x);//先將新元素push進入temp_queue
        while(!_data.empty()){
            temp_queue.push(_data.front());//將數(shù)據隊列元素導入臨時隊列
            _data.pop();
        }
        while(!temp_queue.empty()){
            _data.push(temp_queue.front());//將臨時隊列元素再導入數(shù)據隊列
            temp_queue.pop();
        }
    }
int pop(){
    int x= _data.front();
    _data.pop();
    return x;
}
int top(){
    return _data.front();
}
bool empty(){
     return _data.empty();
}
private:
    std::queue<int> _data;
};

使用棧實現(xiàn)隊列

LeetCode 232. Implement Queue using Stacks
設計一個隊列,隊列支持如下操作,盡量使隊列的各項操作的平均時間復雜度是 常數(shù)級O(1);隊列的內部存儲數(shù)據的結構為棧,棧的方法只能包括push、top、
pop、size、empty等標準的棧方法。
1.push(x) : 將元素x壓入隊列中
2.pop() : 彈出(移除)隊列頭部元素
3.peek() : 返回隊列頭部元素(即為front)
4.empty() : 判斷隊列是否是空

算法設計1,push時調整

1.在隊列push元素時,利用臨時棧調換元素次序


2.將原數(shù)據棧內容push進入臨時棧temp_stack


3.將新數(shù)據push進入臨時棧temp_stack



4.將臨時棧temp_stack中的元素push進入數(shù)據棧data_stack


#include <stack>
class MyQueue{
public:
    MyQueue(){
    }
    void push(int x){
        std::stack<int> temp_stack
        while(! _data.empty){
            temp_stack.push(_data.top());
            _data.pop();
    }
        temp_stack.push(x);   
        while(!temp_stack.empty()){
        _data.push(temp_stack.top());
        temp.pop()  
    }
    }
int pop(){
    int x = _data.top();
    _data.pop;
    return x;
}
int peek(){
    return _data.top();
}
bool empty(){
    return _data.empty();
}
};
算法設計2,雙棧法

雙棧法,即用兩個棧,來實現(xiàn)隊列的功能。一個棧為輸入棧input_stack,一個棧為輸出棧output_stack。 算法過程,整體各項操作的平均算法復雜度常數(shù)級,O(1):
1.push(x)操作:將待壓入的元素x直接push至input_stack中。
2.pop或peek(front)操作,在獲取隊列頭部元素時,可能需要對兩個棧進行調整(adjust): 如果output_stack不空,不需要調整,直接返回或彈出output_stack棧頂元素。 否則,將input_stack全部元素push進入output_stack,每push一個元素input_stack彈出一個元素;然后再返回或彈 出output_stack棧頂元素。
3.empty操作:input_stack與output_stack均為空時,返回true,否則返回false。










#include <stack>
class MyQueue{
public:
    MyQueue(){
    }
    void push(int x){
        _input.push(x);//直接將x push進入_input
    }
    int pop(){
        adjust();//調整再進行pop
        int x = _output.top();
        _output.pop();
        return x;    
    }
    int peek(){
        adjust();
        return _output.top();
    }
    bool empty(){//當input_stack與output_stack 同時為空時,才返回true
        return _input.empty()&&_output.empty();
    }
private:
    void adjust(){
        if(!_output.empty()){
            return ;
        }
        while(!_input.empty()){
            _output.push(_input.top());
            _input.pop();
        }
}
    std::stack<int> _input;
    std::stack<int> _output;
};
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,264評論 0 38
  • 3.1?若按教科書3.1.1節(jié)中圖3.1(b)所示鐵道進行車廂調度(注意:兩側鐵道均為單向行駛道),則請回答: (...
    云時之間閱讀 2,365評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 雨后啄泥逢故燕, 嫩柳拂風撩芳華。 又逢春江花月夜, 誰知玉玦落我家。
    弗念拂念閱讀 178評論 1 0
  • 詩:卿墨白 夜來臥聽風吹雨,幾多春秋幾多情? 繁花落盡伴春泥,燕尾新新入新宅。 天亦有...
    runzhi閱讀 375評論 0 2

友情鏈接更多精彩內容