1. 程式人生 > >【演算法】反轉佇列前K個元素

【演算法】反轉佇列前K個元素

反轉佇列前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(); } }