天天看點

棧與隊列基礎知識

棧,是先進後出的線性表,标準STL的棧包括如下5種操作,設棧S:

1.取出棧頂元素:S.top();

2.判斷棧是否為空:S.empty();

3.将元素x添加至棧:S.push(x)

4.彈出棧頂:S.pop();

5.求棧存儲元素的個數: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.求隊列存儲元素的個數: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.使用隊列實作棧

LeetCode 225. Implement Stack using Queues

設計一個棧,支援如下操作,棧的内部存儲資料的結構為隊列,隊列的方法隻 能包括push、peek(front)、pop、size、empty等标準的隊列方法。

class MyStack{
public:
    MyStack(){
}
    void push(int x){
}
    int pop(){
}
    int top(){
}
    bool empty(){
}        
};           

複制

棧與隊列基礎知識
算法設計,push時調整

普通隊列實作棧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());//将資料隊列元素導入臨時隊列
            _data.pop();
        }
        while(!temp_queue.empty()){
            _data.push(temp_queue.front());//将臨時隊列元素再導入資料隊列
            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;
};           

複制

使用棧實作隊列

LeetCode 232. Implement Queue using Stacks

設計一個隊列,隊列支援如下操作,盡量使隊列的各項操作的平均時間複雜度是 常數級O(1);隊列的内部存儲資料的結構為棧,棧的方法隻能包括push、top、

pop、size、empty等标準的棧方法。

1.push(x) : 将元素x壓入隊列中

2.pop() : 彈出(移除)隊列頭部元素

3.peek() : 傳回隊列頭部元素(即為front)

4.empty() : 判斷隊列是否是空

棧與隊列基礎知識
算法設計1,push時調整
棧與隊列基礎知識

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

棧與隊列基礎知識

2.将原資料棧内容push進入臨時棧temp_stack

棧與隊列基礎知識

3.将新資料push進入臨時棧temp_stack

棧與隊列基礎知識

4.将臨時棧temp_stack中的元素push進入資料棧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,雙棧法

雙棧法,即用兩個棧,來實作隊列的功能。一個棧為輸入棧input_stack,一個棧為輸出棧output_stack。 算法過程,整體各項操作的平均算法複雜度常數級,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;
};           

複制