剑指offer之编程(十七)

题目描述:

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

思路:

首先根据题目给出的示例模拟一下压入和弹出栈,已知序列1,2,3,4,5是压入序列,对于弹出序列 4,5,3,2,1 来说,栈是先进后出的,所以根据压入序列,可以先压入 1,2,3,4 ,然后弹出4,再压入5,然后弹出5,最后依次弹出3,2,1,那么弹出序列就是4,5,3,2,1了;对于弹出序列4,3,5,1,2来说,先压入1,2,3,4,然后弹出4,3,再压入5,然后弹出5,最后栈中剩下1,2,弹出顺序只有2,1,整个弹出顺序是4,3,5,2,1,并不能根据给出的弹出序列弹出,所以第二个就不符合条件。模拟完示例后,根据上述思路,将两个整数序列放入两个数组中,另外需要一个辅助list,首先,将压入序列依次放入list中直到要压入的元素和弹出序列剩余的元素的第一个元素相等,则删除这个元素,然后判断下一个是不是和要弹出的元素相等,如相等则重复上述删除操作,不相等则从上述压栈开始操作,如果所有的元素都入栈了仍然没有找到下一个弹出元素,则不符合。


代码如下:


import java.util.*;

public class Main24 
{

	public static void main(String[] args) 
	{
		int[] pushLine = {1,2,3,4,5};
		int[] popLine = {4,5,2,3,1};
		System.out.println(new Main24().isOrder(pushLine,popLine));
	}
	
	public boolean isOrder(int[] PushLine, int[] PopLine)  //PushLine为压入栈的顺序,PopLine为出栈的顺序,这里的入栈和出栈可能交叉进行,不是只能一次全部进栈完成或出栈完成
	{
		boolean isCould = false;  //是否初入栈成功
		ArrayList<Integer> tempList = new ArrayList<Integer>();  //辅助列表,模拟栈
		int allLen = PushLine.length;  //栈中数据的大小
		int nextPush = 0;  //下一个要压入栈的元素(即下一个进入list的元素的编号)
		int nextPop = 0;   //下一个要弹出栈的元素(即下一个要从list中去掉的元素的编号)
		int index = -1;   //索引
		while(nextPop<allLen)   
		{
			while(tempList.size()==0 || tempList.get(index)!=PopLine[nextPop])  //向辅助list中添加元素,直到栈顶(list末尾)元素与弹出的元素相同
			{
				if(nextPush==allLen)   //当全部压入栈中则退出
					break;
				tempList.add(PushLine[nextPush]);   //将元素压入辅助栈(即添加进list中)
				nextPush++;
				index++;
			}
			
			if(tempList.get(index)!=PopLine[nextPop])  //如果栈顶元素和要弹出元素不相等,则不可以
				break;
			tempList.remove(index);  //弹出栈顶元素即将list的末尾元素移除
			index--;
			nextPop++;
		}

		if(nextPop==allLen && tempList.size()==0)  //如果可以全部按照指定的顺序弹出,那么就成功
			isCould = true;
		
		return isCould;
	}

}




本人经验,仅供参考!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值