1. 程式人生 > >劍指offer之程式設計(十七)

劍指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;
	}

}
本人經驗,僅供參考!