1. 程式人生 > >佇列之雙佇列

佇列之雙佇列

雙佇列指的是兩個佇列,不是雙端佇列,2333。

如果題目要求你用佇列實現DFS,你是否會高呼amazing,unbelievable!其實,用佇列實現DFS的本質就是問用佇列實現棧結構,因為DFS本身就是基於棧實現的。

我們知道,基礎佇列是先進先出的,而棧是先進後出的,兩個完全相反的結構,但是正因為相反,才有相互轉換的可能。

假設我們有兩個佇列data、help,用他們兩個實現一個棧。

push:將資料打進data佇列

pop:將佇列中的元素在保留隊尾的情況下,將其他的資料全部打入help,輸出data的元素,清空data,再將help與data交換即可。

因為棧的pop要的只是最後一個入棧的元素,對於佇列來說,這個元素一定在隊尾,所以只要將前面的元素按照順序維持在另一個結構裡【自然是help佇列】,將隊尾元素pop後,交換兩個佇列即可。

top:將佇列中的元素在保留隊尾的情況下,將其他的資料全部打入help,輸出data的元素,但不清空data。

程式碼:

#include<queue>
#include<cstdio>
using namespace std;
typedef struct{
    queue<int>data,help;
    void push(int val){
        data.push(val);
    }
    void pop(){
        while(data.size()>1){
            help.push(data.front());
            data.pop();
        }
        data.pop();
        swap(help,data);
    }
    int top(){
        while(data.size()>1){
            help.push(data.front());
            data.pop();
        }
        return data.front();
    }
}Stack;

int main(){
    Stack V;
    V.push(1);
    V.push(2);
    V.push(3);        
    V.push(4);
    printf("1234入棧後,棧頂:%d\n",V.top());
    V.pop();
    printf("出棧一個後,棧頂:%d\n",V.top());
}