【演算法】反轉佇列前K個元素
阿新 • • 發佈:2018-12-12
反轉佇列前K個元素
想到佇列的反轉那肯定首先想到的就是堆疊(同理堆疊反轉也可以利用佇列)
有一個辦法我們可以將K個元素入棧,然後可以另一個佇列將剩下的元素放入,隨後我們首先將棧元素迴歸原來的佇列,最後將臨時佇列也入隊。
//使用一個輔助的佇列和堆疊實現
//前k個放入堆疊,後面的放入佇列
//取出時堆疊先入後出,達到反轉目的
void reversalQueue(queue<int>& que, int k)
{
stack<int> stk;
queue<int> tmpque;
int len = que.size();
for (int i = 0; i < len; ++i)
{
if (i < k)
{
stk.push(que.front());
que.pop();
}
else
{
tmpque.push(que.front());
que.pop();
}
}
while (!stk.empty())
{
que.push(stk.top());
stk.pop();
}
while (!tmpque.empty())
{
que.push(tmpque.front());
tmpque.pop();
}
}
顯然上面的方法不是很靠譜,我們可以直接將K個元素入堆疊後,反轉剩下的元素,就可以達到目的。
//使用大小為k的輔助堆疊
//隨後將沒有入棧的部分扔到佇列前面
void reversalQueue2(queue<int>& que, int k)
{
//預設k<que.size()
stack<int> stk;
for (int i = 0; i < k; ++i)
{
stk.push(que.front());
que.pop();
}
while (!stk.empty())
{
que.push(stk.top());
stk.pop();
}
for (int i = 0; i < que.size () - k; ++i)
{
que.push(que.front());
que.pop();
}
}