网易有道:构造队列

题目链接:构造队列

第一种做法:

思路就是将题目给的这个队列,反向构造出来就行了。我们可以看这个队列:

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到n、长度n的序列,每次取出来第一个数放到最后一位,然后再取出来序列第一位元素放入到一个新的序列中,最后会得到一个新的序列,顺序是从1到n。
然后现在告诉你n,问你是否能反推出之前的序列。
那就逆推就行了:

正向操作 反向操作
当队列不空时循环 当队列长度不为n时循环
删掉队首插入到队尾 删除队尾插入队首
逐个取出1到n 逐个插入n到1

其实虽然直接做了出来,但是脑子迷迷糊糊的=-=

#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
int main()
{
	int T,n;
	cin>>T;
	while(T--)
	{
		cin>>n;
		queue<int> q;
		stack<int> s;
		int push_num=n;
		while(q.size()!=n)			//队列不空时循环 
		{
			q.push(push_num);		//逐个倒插 
			int x=q.front();	
			q.pop();
			q.push(x);
			push_num--;
		}
		while(!q.empty())			//这个队列实际上存储的是反序的 
		{
			s.push(q.front());		//把它塞到栈里然后输出刚好就是正序了 
			q.pop();
		}
		cout<<s.top();					 
		s.pop();
		while(!s.empty())
		{
			cout<<" "<<s.top();
			s.pop();
		}
		cout<<endl;
	}
	return 0;	
} 

猜你喜欢

转载自blog.csdn.net/q1122333/article/details/82858050