题目:

  输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路:

  添加一个辅助栈

  我们将用上面一个指针,pNextPush,进行移动,每移动一次将里面的数压栈,直到栈顶与下面一个指针指向的数相同时停下,

(至于为什么pNextPush跑到5,详情见代码)

  接下来我们弹栈,把下面一个指针pNextPop向前移动,发现不相等,那么我们就执行上面一步

以此类推,最后当我们得到pNextPop走到最后,而且栈为空时,我们就可以得出题设成立,接下来贴出一段书中不成立的例子,就不具体分析了

  

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
boolean bPossible = false;
if(pushA.length==0&&popA.length==0)
return bPossible; int pNextPush = 0;
int pNextPop = 0;
Stack stack = new Stack(); while(pNextPop<pushA.length){
while(stack.isEmpty()||(int)stack.peek()!=popA[pNextPop]){ if(pNextPush==pushA.length)
break; stack.push(pushA[pNextPush]);
pNextPush++;
} if((int)stack.peek()!=popA[pNextPop])
break;
if(pNextPop<popA.length&&(int)stack.peek()==popA[pNextPop]){
int out = (int)stack.pop();
System.out.println(out);
pNextPop++;
} }
if(stack.isEmpty()&&pNextPop==popA.length){
bPossible = true;
} return bPossible;
}
}

  这道题的判断条件非常值得推敲,第一个while:

   while(pNextPop<pushA.length)如果这里把它改成pNextPush<Length,那么我们的循环将会提前结束,也就是如下图情况

  接下来还有中间的判断

    public boolean IsPopOrder(int [] pushA,int [] popA) {
boolean bPossible = false;
if(pushA.length==0&&popA.length==0)
return bPossible; int pNextPush = 0;
int pNextPop = 0;
Stack stack = new Stack(); while(pNextPop<pushA.length){
while(stack.isEmpty()||(int)stack.peek()!=popA[pNextPop]){ if(pNextPush==pushA.length)
break; stack.push(pushA[pNextPush]);
pNextPush++;
}
if(pNextPop<popA.length&&(int)stack.peek()==popA[pNextPop]){
int out = (int)stack.pop();
pNextPop++;
}
/*这是我第一版的代码
这里这么写主要是为了防止死循环,重新进入循环内第一个while
然而这也导致了卡在了上图的时候,就直接跳出循环*/ if(pNextPush==pushA.length)
break; }
if(stack.isEmpty()&&pNextPop==popA.length){
bPossible = true;
} return bPossible;
}

  

 while(pNextPush<pushA.length){
while(stack.isEmpty()||(int)stack.peek()!=popA[pNextPop]){ if(pNextPush==pushA.length)
break; stack.push(pushA[pNextPush]);
pNextPush++;
} if(pNextPop<popA.length&&(int)stack.peek()==popA[pNextPop]){
int out = (int)stack.pop();
System.out.println(out);
pNextPop++;
}
/*这是第二版的循环体,显然不科学,当4弹出时,5还未进栈,条件成立,直接退出*/
if((int)stack.peek()!=popA[pNextPop])
break; }

  

最新文章

  1. 在sharepoint2013中如使用PowerView
  2. Leetcode N-Queens
  3. LeetCode 135 Candy(贪心算法)
  4. BZOJ3697: 采药人的路径
  5. ext 3.2 tree 在IE10中点击事件失效的bug
  6. android:android:background=&quot;#00000000&quot;,透明效果
  7. 代码块(Block)回调一般阐述
  8. js 计时器小练-20160601
  9. hibernate持久化框架
  10. 项目总结一:响应式之CSS3 媒体查询
  11. Unity UGUI基础之Toggle
  12. PS 色调——老照片效果
  13. 卷积神经网络系列之softmax,softmax loss和cross entropy的讲解
  14. 【XSY1294】sub 树链剖分
  15. 在js或jquery中动态添加js脚本【转】
  16. Codeforces 305E Playing with String 博弈
  17. 反射的所有api
  18. 本日吐槽!“人傻钱多”的P2P公司是否是程序员的合适选择(群聊天记录的娱乐)
  19. js获取单个查询串的值
  20. elasticsearch 亿级数据检索案例与原理

热门文章

  1. 将逗号分隔的字符串转换为Python中的列表
  2. re库
  3. 【css3】nth-child
  4. 16 python 初学(生成器)
  5. ogg BR – BOUNDED RECOVERY
  6. Python脱产8期 Day09 2019/4/23
  7. Mybatis学习总结(七)——调用存储过程
  8. Generative Adversarial Nets[EBGAN]
  9. logistic回归和最大熵
  10. Java关键字(四)——final