题目: 1060-合法栈输出
分析:
本题是一道模拟题,模拟数据进栈与出栈的顺序,本题需要解决两个子问题
第一个问题:用什么的存储结构模拟进栈与出栈
首先进栈可以用一个队列a和栈b来模拟即a队列的首元素进b栈后便删除a的队列的首元素;队列c模拟出栈的顺序即b栈出一个数据进c队列,如图所示为模拟情况
第二个问题:如何遍历所有的进栈出栈情况呢
用DFS(递归)和回溯法来遍历所有的进栈出栈情况,具体如下:如上图在a队列的数据1向b栈输入后,这个数据有两种选择:选择一,直接出栈进入c队列;选择二,继续留在b栈里(这样的选择顺序保证了升序排列);输入的每个数据都如上述的1一样有两种选择:出栈进队列c或继续留在b栈。(在写DFS用回溯法即记录数据做出第一个选择出栈进队列c前的状态)递归出口为:c队列的大小为n时,输出c队列的所有数据即出栈顺序
代码:
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int n;
void solve(queue<int> a, stack<int> b, queue<int> c)
{
if (c.size() == n)
{
while (!c.empty())
{
cout << c.front();
c.pop();
}
cout << endl;
return;
}
if (b.empty())
{
b.push(a.front());
a.pop();
}
queue<int> c1 = c; stack<int> b1 = b;
c1.push(b1.top());
b1.pop();
solve(a, b1, c1);
if (!a.empty())
{
b.push(a.front());
a.pop();
solve(a, b, c);
}
}
int main()
{
int i;
stack<int> b;
queue<int> c;
while(cin>>n)
{
queue<int> a;
for (i = 1; i <=n; i++)
a.push(i);
solve(a, b, c);
}
return 0;
}
/*
1
3
*/