劍指offer第二版 面試題31(java)

2021-09-21 01:23:20 字數 1675 閱讀 5005

面試題:棧的壓入、彈出序列

題目:

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。

假設壓入棧的所有數字均不相等

例如:序列是某棧的壓棧序列,序列是該壓棧序列對應的乙個彈出序列,但就不可能是該壓棧序列的彈出序列

思路:

分為兩個部分:壓棧部分出棧比較部分

1. 根據出棧序列進行壓棧部分

將壓棧序列按順序壓入棧,彈出棧的順序按彈出棧序列決定

為壓棧序列和出棧序列分別設定乙個loc 壓棧——i 出棧——j (壓棧為a 出棧為b)

當a[i] = b[j] 時,可視為壓入該數字後直接彈出,即可直接i++,j++

當a[i]!=b[j]時,有兩種情況:①當前棧中,棧頂元素不為需要彈出的b[j]——壓入當前a[i];②當前棧中,棧頂元素為需要彈出的b[j]——彈出棧中元素,i保持原地,j++

2. 出棧比較

當壓棧部分結束後,棧中剩餘的應是出棧序列中的順序排列的數,進行比較,如果順序不同,則表示不為所對應的棧彈出順序

eg:

1. 入棧部分

入棧順序 1,2,3,4,5

出棧順序 2,1,5,4,3

i=0,j=0 ——此時入棧為1,出棧為2,棧為空,所以壓入1,i++

i=1,j=0 ——此時入棧為2,出棧為2,棧不為空,但兩數相同,則直接忽略,i++,j++

i=2,j=1——此時入棧為3,出棧為1,棧不為空,兩數不同,但棧頂元素為出棧元素相同,所以棧中pop1,j++

i=2,j=2——此時入棧為3,出棧為5,棧不同,兩數不同,棧頂元素與出棧元素不同,壓入棧,並i++,同理壓入下乙個元素4

i=4,j=2——此時入棧為5,出棧為5,兩數相同,忽略,i++,j++

此時棧中從底到頂為3 4

2. 比較部分

從j位置開始比較,

j=3,出棧為4,pop出4——符合,j++

j=4,出棧為3,pop出3——符合,j++(邊界,跳出)

得出結論為符合

若出棧順序使2,1,5,3,4,在比較部分,pop4但出棧為3,就不會符合

【注意】i的++由for迴圈實現,但需要注意在棧頂元素為出棧元素相同時,由於i需要不改變位置,但for預設一輪次+1,所以需要對i--

public class q31 ;

int b = new int ;

boolean result = ispoplist(a,b);

system.out.println(result);

}public static boolean ispoplist(int a,int b)

// 為空

if(a.length==0 && b.length==0)

stacksta = new stack();

int j=0;

for(int i =0;i}else

}}

for(int k=j;k}

return true;

}}

劍指offer第二版 面試題6(java)

面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...

劍指offer第二版 面試題8 java

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...

劍指offer第二版 面試題9(java)

面試題9 用兩個棧實現佇列 題目描述 方法 兩個棧 stack1 stack2 插入時,直接放入stack1 刪除時,直接彈出pop2中的物件 如果pop2為空,則先將pop1中的物件放入stack2中,再從stack2裡pop第乙個 如 依次放入stack1中1 2 3,在彈出並放入stack2中...