21.スタックプッシュ、ポップシーケンス
問題:
整数の2つの入力配列、プレス積層順序を表す第1の配列は、それが第二の配列ポップアップスタックの順序が可能であるか否かを判断します。スタックが等しいと仮定されている上に全ての数字は、押されていません。1,2,3,4,5の配列の配列がスタックに押し込まれるような、プッシュシーケンスがポップの配列に対応する4,5,3,2,1配列が、4,3,5,1,2シーケンスのポップアップシーケンスをプッシュすることは不可能です。(注:2つのシーケンスの長さが等しいです)
ソリューション:
思想:
スタックについての最初の話に、補助スタックプッシュトラバーサル順序を借りて、ここで1、決定され、その後、上部要素は、これが4であり、うち最初の要素スタック順序のない、その≠4は明らかです私たちは同じスタックの開始後までプッシュし続けるので、スタックは順序があるまで、それは戻って1を移動する、要素であるスタックに等しくない、とサイクルYazhan順トラバーサルが完了するので、補助スタックが空でない場合記載される配列は、ポップポップ・スタックの順序ではありません。
例えば:
1,2,3,4,5を描きます
スタック4,5,3,2,1
最初の補助スタック、スタック1≠4に図1に示すように、スタック2を続け
このとき、スタック2≠4は、スタックし続ける3
このとき、スタック3≠4,4は、スタックに続けます
この時点で、スタック4 = 4、スタック4、ポップアップ配列バック、この場合、補助スタック5 1,2,3内部,,
このとき、スタック3≠5、5プッシュを続けます
この時点で5 =スタック5、スタック5、ポップアップ配列バック、2,3であり、この場合に、補助スタック3 ,,
...。
実装に続いて、最後に補助スタックが空です。そうでない場合は、空のポップ記載される配列は、ポップ、スタックの順序ではありません。
Pythonコード:
# -*- coding:utf-8 -*-
class Solution:
def IsPopOrder(self, pushV, popV):
# write code here
if not pushV or len(pushV)!=len(popV):
return False
stack=[]
for i in pushV:
stack.append(i)
while(len(stack) and stack[-1]==popV[0]):
stack.pop()
popV.pop(0)
if(len(stack)):
return False
return True