題目描述:
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。
假設壓入棧的所有數字均不相等。
例如序列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]
輸出:true
分析:
本題為判斷某序列是否為棧混洗序列。我們知道,只要某序列中不存在「312」禁形即為合法的棧混洗。當然這題我們直接模擬棧混洗的過程即可解決。
方法一:
不用棧,使用雜湊map來標識各個元素的狀態:0-未入棧;1-已入棧;2-已出棧。然後人為的對序列進行遍歷,首先定義p指標指向入棧序列,向右移動直到找到第乙個等於出棧序列首位元素的元素,移動過程中將掃過的元素均入棧(設標識為1)。
在匹配下乙個出棧序列元素時,判斷該元素的狀態,未入棧p則右移,已入棧p則左移,並且將掃過的元素出棧(設標識為2)。如果出棧序列**現了標識為01以外的元素,則不匹配。
class solution
m[pushv[p]] = 2;
continue;
}if(m[popv[i]] == 1)
m[pushv[p]] = 2;
continue;
}else
}return true;
}};
方法二:
用棧模擬棧混洗。
先將最先要入棧的元素入棧,然後判斷當前棧頂元素是否等於q指向的出棧序列元素,相等則出棧,q++,繼續判斷,不等則在繼續入棧,重複操作。
注意這題的邊界,不匹配時肯定是p最先用完,所以判斷p即可,最後p到達n,迴圈結束,棧空則說明棧混洗序列合法,否則不合法。
class solution
if(++p < n) s.push(pushv[p]);
}if(s.empty()) return true;
return false;
}};
42 棧的壓入 彈出序列
本題只要考點在解題思路上 借用乙個輔助的棧,遍歷壓棧順序,先講第乙個放入棧中,這裡是1,然後判斷棧頂元素是不是出棧順序的第乙個元素,這裡是4,很顯然1 4,所以我們繼續壓棧,直到相等以後開始出棧,出棧乙個元素,則將出棧順序向後移動一位,直到不相等,這樣迴圈等壓棧順序遍歷完成,如果輔助棧還不為空,說明...
棧的壓入彈出序列
題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列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是該壓棧序列對應的乙個彈出序列,但4 3 5 1 2就不可能是該壓棧序列的彈出序列。bool ispoporder cons...