劍指offer之程式設計(十七)
阿新 • • 發佈:2019-01-27
題目描述:
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出序列。假設壓入棧的所有數字均不相等。例如序列 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; } }