佇列之雙佇列
雙佇列指的是兩個佇列,不是雙端佇列,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());
}