您的位置:首页 > 编程语言 > C语言/C++

根据入栈顺序得出所有可能的出栈顺序(c++)

2013-06-25 13:58 375 查看
之前一直纠结一道题,就是标题

不是手动的进行,而是通过写代码来输出

我当时看到这个问题,我说有多难嘛?

不就是模拟入栈操作,逻辑上是,一个元素入栈之后,可以立刻出栈,也可以继续下一个元素的入栈

明显这应该是穷举,深度搜索,不过这个看似简单的题竟然让我调试了一天(成了巧合编程)。。。

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)

我还需要做更多的练习,加油~~菜鸟也能成为大神~!!
如果发现有错,请告诉我,无尽感谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐