[java-算法-数据结构] 判断栈的弹出顺序是否正确
2017-05-15 12:25
274 查看
package stack; import java.util.Hashtable; import java.util.Stack; /** * 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 * 假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列, * 但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) * Created by ZeHua on 2017/5/15. */ public class IsPopOrder { //通过比较下标判断是否为弹出序列,出现第一个 public boolean IsPopOrder(int [] pushA,int [] popA) { if(pushA.length!=popA.length)return false; if(popA.length==1&&popA[0]!=pushA[0]){ return false; }else if(popA.length==1&&popA[0]==pushA[0]){ return true; } //通过值找下标 Hashtable<Integer,Integer> value_index = new Hashtable<>(); for(int i=0;i<pushA.length;i++){//初始化 值——下标 对应关系 value_index.put(pushA[i],i); } //目前下标最大值,改为最大下标栈 Stack<Integer> max_index = new Stack<>(); //结束压栈的pushA下标 int end_index = 0; //遍历一遍,检查是否为弹出序列,遍历的值只能大于等于最大下标栈栈顶值 for(int i=0;i<popA.length;i++){ //目前popA[i]的值在pushA的下标 int cur_index_popAinPushA = value_index.get(popA[i]); // int top_maxStack=max_index.peek(); //大于最大下标栈栈顶值或栈为空,则压栈 if(max_index.isEmpty()||cur_index_popAinPushA>max_index.peek()){ for(int j=end_index;j<=cur_index_popAinPushA;j++){ max_index.push(j); } end_index= max_index.pop()+1; continue; } //等于最大下标栈栈顶值,则弹栈 if(cur_index_popAinPushA==max_index.peek()){ max_index.pop(); continue; } if(cur_index_popAinPushA<max_index.peek()){//小于最大下标栈栈顶值,检查出不是弹出序列 return false; } } //没检查出错误,返回true return true; } }
相关文章推荐
- 已知栈的压入顺序,判断弹出顺序是否正确
- 假设表达式中包含三种括号 圆括号方括号大括号 设计一个算法用顺序栈判断表达式中的括号是否正确配对
- 算法学习【9】判断是否为栈的弹出顺序
- 算法学习----给定入栈的顺序,判断另一个顺序是否为该入栈顺序的一个弹出顺序
- 判断栈的压入顺序与弹出顺序是否正确C++
- java判断出栈顺序是否正确
- 从零开始学习算法(Java实现)~~~~之字符串篇~~~判断两个字符串是否是颠倒字母顺序构成的
- 判断出栈顺序是否正确(栈的压入、弹出序列)
- 数据结构和算法设计专题之---判断两个链表是否相交并找出交点
- java中判断输入日期的格式是否正确
- java算法程序题,输入三个数求哪个是最大数,先判断这三个数是否整数,不是就打印提示:请输入数字,若是就打印出那个最大数
- 判断出栈顺序是否正确
- Java中用正则表达式判断日期格式是否正确
- java 判断日期格式是否正确,日期是否规范
- C++ 判断栈的弹出序列是否正确
- Java判断时间,Email,手机号是否为正确格式
- 根据栈的压入序列判断弹出序列是否正确(模板实现)
- java经典算法_037判断字符是否属于中文
- 一个判断一个数是否为质数的算法-JAVA版
- java 判断电话号码,邮箱格式是否正确