根据入栈顺序得出所有可能的出栈顺序(c++)
2013-06-25 13:58
375 查看
之前一直纠结一道题,就是标题
不是手动的进行,而是通过写代码来输出
我当时看到这个问题,我说有多难嘛?
不就是模拟入栈操作,逻辑上是,一个元素入栈之后,可以立刻出栈,也可以继续下一个元素的入栈
明显这应该是穷举,深度搜索,不过这个看似简单的题竟然让我调试了一天(成了巧合编程)。。。
string sin;//存储进栈顺序
数据:ab ba
结果:ab ba
ba ab
数据:abcd
结果:dcba (8 =2^(4-1) )
cdba
bdca
bcda
adcb
acdb
abdc
abcd
结果说明出栈顺序的个数 m跟 入栈个数n的关系是 m = 2 ^( n -1)
我还需要做更多的练习,加油~~菜鸟也能成为大神~!!
如果发现有错,请告诉我,无尽感谢
不是手动的进行,而是通过写代码来输出
我当时看到这个问题,我说有多难嘛?
不就是模拟入栈操作,逻辑上是,一个元素入栈之后,可以立刻出栈,也可以继续下一个元素的入栈
明显这应该是穷举,深度搜索,不过这个看似简单的题竟然让我调试了一天(成了巧合编程)。。。
string sin;//存储进栈顺序
void fun(int n, stack <char> stk, string sout) { if(n > sin.size() && stk.empty())//如果入栈完毕了,且也栈空了,就输出此出栈顺序 这个是递归的结束条件 cout<<sout<<endl;//也可以用vector记录下来 else//以上其中一项未完成 { //选择入栈 if (n < sin.size())//如果是未全部入栈 入口1 { stk.push(sin );// 继续入栈 fun(n+1, stk, sout);//执行下一个操作 } //选择出栈 if (!stk.empty() && n != sin.size()-1)//如果栈不空,并且,入栈元素不是最后一个 入口2 { //当到最后一个字符入栈之后,上面已经执行先出栈了 sout += stk.top();//记录出栈元素 stk.pop();//出栈 fun(n+1, stk, sout); } } }
数据:ab ba
结果:ab ba
ba ab
数据:abcd
结果:dcba (8 =2^(4-1) )
cdba
bdca
bcda
adcb
acdb
abdc
abcd
结果说明出栈顺序的个数 m跟 入栈个数n的关系是 m = 2 ^( n -1)
我还需要做更多的练习,加油~~菜鸟也能成为大神~!!
如果发现有错,请告诉我,无尽感谢
相关文章推荐
- 根据入栈顺序输出所有可能的出栈顺序 (Java)
- 对于给定的字符串,求其入栈后,所有可能的出栈顺序
- 栈问题-根据入栈序列,得出可能的出栈序列
- 给定入栈顺序,求所有可能的出栈顺序
- 给定入栈顺序,输出所有可能出栈情况及所有情况的总数
- DFS 遍历数组所有可能存在的出栈顺序
- 顺序进栈乱序出栈的所有可能顺序之算法
- 指定栈的进栈顺序,输出所有可能的出栈顺序
- 1-5入栈顺序有多少种可能出栈结果
- 给定入栈顺序,输出所有可能的出栈情况,并判断给定的序列是否为正确的输出序列
- 设元素入栈的顺序是1、2、3、…、n ,则所有可能的出栈序列共有几种
- 根据已知入栈顺序判断一个数组是否是出栈顺序
- n个不同数所有可能的出栈顺序及其引出的卡特兰数(catalan)
- 剑指offer-根据入栈顺序判断出栈顺序是否正确
- 在1、2、3...9(保持这个顺序)之间可任意放+或者-或者不放,使其结果等于100,输出所有可能的放法。js写法
- 比如“1,2,3....10”,1到10这10个数,显示他的所有可能组合情况(排列顺序无所谓)
- 入栈顺序为1,2,3,4,5出栈顺序不可能的顺序是什么
- JAVA顺序栈操作——初始化、入栈、出栈、判断空栈、判断栈满
- 假设栈的输入序列为1、2、3、...、n,求出所有可能的出栈序列
- 判断元素出栈、入栈顺序的合法性。如:入栈的序列( 1,2,3,4,5 ),出栈序列为 ( 4,5,3,2,1 )是合法序列,入栈的序列( 1,2,3,4,5 ),出栈序列为( 1,5,3,2,4 )是