輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)。
題目中的所有資料都不相同是題眼,根據這個,可以模擬壓棧,然後根據彈出順序,每一次壓入之後,和彈出序列中相比,然後將相等的值彈出,同時移動指向彈出序列的指標,當壓棧序列所有元素都已經遍歷過一遍,如果棧中沒有元素了,返回true,否則返回false。
另一種思路是從彈出序列看,比如按照入棧序列入棧之後彈出的序列是5,4,3,2,1,但是如果現在考察的序列是3,5,4,2,1那麼說明在入棧到3的時候彈出,然後繼續入棧,到5彈出,所以說當後面彈出的值大於當前的值是沒有問題的,但是如果小於這個值,那麼就必須保證這兩個之間所有數全部彈出,比如在4之後彈出的2,4和2之間有個3,彈出之後就可以在4之後彈出2。這種思路需要先將入棧序列做乙個對映,將序列中的數對映到1-n,然後對映相應的彈出序列。
思路一:
class
solution}if
(data.
size()
)return
false
;return
true;}
};
思路二:
class
solution
int last=popv[0]
,tmp,j;
visit[last]=1
;for
(i=1
;i) last=tmp;
}return
true;}
};
棧的壓入 彈出順序 C 版本
題目描述 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度...
劍指offer 棧的壓入彈出順序
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 ...
棧的壓入 彈出序列和棧所有可能的彈出順序
include include include using namespace std bool ispoporder char ppush,char ppop,int nlength void permutation char str,int length if stackdata.top pne...