您的位置:首页 > 理论基础 > 数据结构算法

[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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 算法 java