判断可能出栈顺序--动态规划解法
2013-05-20 14:36
274 查看
先给定一个进栈序列(如1,2,3,4,5),可以随意弹栈(如在3进栈之前,2就可能已经进栈然后出栈了)
然后给定一个序列如5,4,3,2,1和3,4,5,1,2,判断是不是其弹栈序列。
我是用动态规划强行弄出来的,弄出来后查质料得知这是一个卡特兰数问题。。。。
思路:
例子4,3,5,1,2
一旦一个数弹栈了比如上面序列中的4,在它进栈之前又在它后面出栈的元素,如1,2,3在它之前进栈,同时又在它后面出栈的序列(3,1,2)
如果这个序列不是和他们进栈的顺序相反的,那么就不是栈的可能出栈顺序。
实现如下
运行结果:
然后给定一个序列如5,4,3,2,1和3,4,5,1,2,判断是不是其弹栈序列。
我是用动态规划强行弄出来的,弄出来后查质料得知这是一个卡特兰数问题。。。。
思路:
例子4,3,5,1,2
一旦一个数弹栈了比如上面序列中的4,在它进栈之前又在它后面出栈的元素,如1,2,3在它之前进栈,同时又在它后面出栈的序列(3,1,2)
如果这个序列不是和他们进栈的顺序相反的,那么就不是栈的可能出栈顺序。
实现如下
bool Check(int *index,int *ipt,int length) { bool inverse=false; //记录是否有逆序数 int max=index[ipt[length-1]]; //max记录已经扫描的序列中最大元素 int min=max; //min记录已经出现的元素中按降序出现的最大元素 int lastinv=min; //如4,5,3,2 max=5,min=4 for(int i=length-2;i>0;i--) { if(index[ipt[i]]>max) { if(max!=index[ipt[i+1]]) //特殊情况,出现新的最大数,那么最大不是在之前的话则不是 return false; else max=index[ipt[i]]; } else if(index[ipt[i]]>min&&index[ipt[i]]<max) { if(inverse&&index[ipt[i]]>lastinv) //如果有逆序数,且比最小的逆序数大 return false; min=index[ipt[i]]; continue; } else if(index[ipt[i]]<min) { if(inverse&&index[ipt[i]]>lastinv) //如果有逆序数,且比最小的逆序数大 return false; if(!inverse) //记录是否有逆序数 inverse=true; lastinv=min; //始终记录最小的逆序数 min=index[ipt[i]]; } else if(inverse) if(index[ipt[i]]>lastinv&&index[ipt[i]]<max) return false; } return true; }
运行结果:
相关文章推荐
- 给定一个入栈顺序和一个出栈顺序,判断出栈顺序是否可能
- 给定入栈顺序,输出所有可能的出栈情况,并判断给定的序列是否为正确的输出序列
- 判断元素出栈、入栈顺序的合法性。如:入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)是合法序列
- 判断栈的出栈顺序合法性
- 卡特兰数---n 个元素顺序入栈,则可能的出栈序列有多少种
- 数据结构--栈:进栈顺序1234,出栈顺序有哪些?3142不可能
- 判断元素入栈,出栈顺序的合法性
- 栈的顺序存储的初始化、判断栈空、入栈、出栈、读取栈顶元素、栈置空、求栈长操作
- 铁轨问题 判断是否为出栈顺序
- DFS 遍历数组所有可能存在的出栈顺序
- n 个元素顺序入栈,则可能的出栈序列有多少种?
- 【练习】输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序
- 题目:输入两个整数序列。其中一表示栈的 push 顺序,判断另一个序列有没可能是对应的 pop 顺序
- JAVA顺序栈操作——初始化、入栈、出栈、判断空栈、判断栈满
- 元素出栈、入栈顺序的合法性(判断一个字符串是否按照出栈顺序)
- n 个元素顺序入栈,则可能的出栈序列有多少种?
- 不可能的出栈顺序
- 关于一个栈的输入顺序是a,b,c,d,e则下列序列中不可能是出栈顺序
- 栈-判断某个出栈顺序是否合法
- n个不同数所有可能的出栈顺序及其引出的卡特兰数(catalan)