题目链接:构造队列
第一种做法:
思路就是将题目给的这个队列,反向构造出来就行了。我们可以看这个队列:
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;
}