1. 程式人生 > >構造佇列,網易,想直接修改佇列中的值,就用queue

構造佇列,網易,想直接修改佇列中的值,就用queue

小明同學把1到n這n個數字按照一定的順序放入了一個佇列Q中。現在他對佇列Q執行了如下程式:
while(!Q.empty())              //佇列不空,執行迴圈

{

    int x=Q.front();            //取出當前隊頭的值x

    Q.pop();                 //彈出當前隊頭

    Q.push(x);               //把x放入隊尾

    x = Q.front();              //取出這時候隊頭的值

    printf("%d\n",x);          //輸出x

    Q.pop();                 //彈出這時候的隊頭

}

做取出隊頭的值操作的時候,並不彈出當前隊頭。
小明同學發現,這段程式恰好按順序輸出了1,2,3,...,n。現在小明想讓你構造出原始的佇列,你能做到嗎?[注:原題樣例第三行5有錯,應該為3,以下已修正] 
輸入描述:
第一行一個整數T(T ≤ 100)表示資料組數,每組資料輸入一個數n(1 ≤ n ≤ 100000),輸入的所有n之和不超過200000。


輸出描述:
對於每組資料,輸出一行,表示原始的佇列。數字之間用一個空格隔開,不要在行末輸出多餘的空格.
#include <iostream>
#include <vector>
#include <algorithm>
#include<queue>
using namespace std;





int main()
{

	int T;
	cin >> T;
	for (int i = 0; i < T; i++)
	{
		int n;
		cin >> n;
		vector<int> a(n, 0);//想直接修改佇列中的值,就用queue<int*>
		queue<int*> q;//想想為什麼不用queue<int> q,而在佇列中使用的是地址。int*
		for (int i = 0; i < n; i++)  q.push(&a[i]);
		int k = 1;
		while (!q.empty())
		{
			q.push(q.front());
			q.pop();
			*q.front() = k++;//如果使用queue<int>,此處該為q.front() = k++,但是結果並未改變,說明q.front()會產生臨時變數。
			q.pop();
		}
		for (int i = 0; i < n-1; i++)  cout << a[i] << " ";
		cout << a[n - 1] << endl;





	}






	//system("pause");
	return 0;

}