Reference
关于出栈顺序的模拟和数学检测,之前写过
ZJU数据结构 02-线性结构4 Pop Sequence (25 分)
有启发意义一道题目,学习了在dfs有多个选支时应该如何操作,that is,把当前的状态(含数组,参数等)备份一份,此时两种选支可以串行。
将栈和队列建立在栈里,可以自动控制构造和析构,不用多操心,很方便。
#include <cstdio>
#include <iostream>
#include <stack>
#include <queue>
#include <string>
using namespace std;
queue<char> src,dst;//使用队列来保存输入和输出的的字符序列
stack<char> st;//中间栈
int cnt=0;//解计数器
void dfs(queue<char> &src,stack<char> &st,queue<char> &dst)
//有多种可能的下一步操作且相互会干扰时,需要备份上一次的状态,独立执行
//每次进入的dfs都是一个独立的状态
{
if(src.empty()){//已全部入栈
if(st.empty()){//中间栈为空,则所有字符已进入dst队列
while(!dst.empty()){//打印dst队列
printf("%c ",dst.front() );
dst.pop();
}
++cnt;
putchar('\n');
}
else{//如果已全部入栈但是栈内还有元素,就把栈里的内容全部拷贝到dst里
dst.push(st.top());
st.pop();
dfs(src,st,dst);
}
return ;
}
//src内还有元素未入栈,则每一步有两种独立的走法,要么压栈新元素,要么出栈原有元素(如果有)
//备份原来的状态
queue<char> src0(src),dst0(dst);
stack<char> st0(st);
//要么压栈
st.push(src.front());
src.pop();
dfs(src,st,dst);//继续搜索
//要么出栈
if(!st0.empty()){
dst0.push(st0.top());
st0.pop();
dfs(src0,st0,dst0);
}
}
int main(int argc, char const *argv[])
{
string s;cin>>s;//输入一个字符串
//将输入的字符串的字符按单字拆分录入src
for (int i = 0; i < s.size(); ++i) src.push(s[i]);
dfs(src,st,dst);
cout<<"Possiblities:"<<cnt<<endl;
return 0;
}