分析
以123为例,假如123在一个队列里,输入到中间栈,通过中间栈输出到右边队列中(这里用队列是为了方便输出,用数组储存也行)
我们分析一下中间的过程:
假如1已经入栈,这个时候有两种可能,要么中间栈栈顶的数据移动到右队列中,要么左队列中的数据移动到中间栈中,所以采用递归的方法,从而求出所有可能的情况。递归终止的条件是左队列和中间栈均空。代码如下。
代码部分
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
void input_legal_order(queue<char>a1, stack<char>s, queue<char>a2);
void one(queue<char>a1, stack<char>s, queue<char>a2); //第一种选择:a1如果不空,把a1的压入到s中
void two(queue<char>a1, stack<char>s, queue<char>a2); //第二种选择:s如果不空,把s的压入到a2中
int main()
{
queue<char> a1; //输入栈
stack<char> s; //辅助栈
queue<char> a2; //输出队列
cout << "请输入序列:";
char ch;
ch = cin.get();
while(ch!='\n')
{
a1.push(ch);
ch = cin.get();
}
cout << "合法的输出序列有:" << endl;
input_legal_order(a1, s, a2);
return 0;
}
void input_legal_order(queue<char>a1, stack<char>s, queue<char>a2)
{
if(a1.empty()&&s.empty()) //如果输入栈和辅助栈均空,表明输出完成,数据已经进入a2中
{
while(!a2.empty()) //输出a2里的数据
{
cout << a2.front();
a2.pop();
}
cout << endl;
return;
}
/*如果输入栈和辅助栈均不空,接下来有两种选择:
* 1.输出栈中有一个数据弹出并压入辅助栈中
* 2.辅助栈中有一个数据弹出并压入输出队列中
* 故采用递归的方法
*/
one(a1, s, a2);
two(a1, s, a2);
}
void one(queue<char>a1, stack<char>s, queue<char>a2) //第一种选择
{
if(a1.empty()) //如果输出栈空了,直接返回
return;
s.push(a1.front());
a1.pop();
input_legal_order(a1,s,a2);
}
void two(queue<char>a1, stack<char>s, queue<char>a2) //第二种选择
{
if(s.empty()) //如果辅助栈空了,直接返回
return;
a2.push(s.top());
s.pop();
input_legal_order(a1,s,a2);
}
博主也是刚学数据结构,发出了自己结合网上和个人理解的思路,如果有错误和可以改进的地方,请在评论区留言哦!