日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试题整理6 栈的压入、弹出序列

發(fā)布時間:2025/3/21 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试题整理6 栈的压入、弹出序列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

《劍指offer》面試題22:

題目:輸入兩個整數(shù)序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出序列。假設(shè)壓入棧的所有數(shù)字均不相同。

????????? 例如序列1、2、3、4、5是某棧的入棧序列,序列4、5、3、2、1是該壓棧序列所對應的一個彈出序列,但是4、3、5、1、2就不可能是該壓棧序列的彈出序列。

分析:

???????? 直觀想法是使用輔助棧,把輸入的第一個序列數(shù)字依次壓入輔助棧,并按照第二個序列的順序依次從棧中彈出數(shù)字。

???????? 舉具體數(shù)字進行分析,得出判斷一個序列是否是棧的彈出序列的規(guī)律:

??????????如果序列的下一個數(shù)字正好是棧頂?shù)臄?shù)字,那么直接彈出;如果下一個數(shù)字不在棧頂,則把壓棧序列中還沒有入棧的數(shù)字壓入輔助棧,直到找到需要彈出的數(shù)字壓入棧頂為止。如果所有的數(shù)字都壓入棧了仍然沒有找到下一個彈出的數(shù)字,那么該序列不可能是一個彈出序列。

???????? 當看到此題的時候,我想到一個方法,此種想法是錯誤的:如果彈出序列中有兩個連續(xù)數(shù)字和壓棧時相同,而最長的相同序列不位于壓棧的尾部,我來斷定不可能是該壓棧序列的彈出序列。因為如果彈出序列中兩個連續(xù)數(shù)和壓入順序相同,那么只能是壓入第一個彈出再壓入第二個彈出此種方式,但是忽略了可以第一個第二個壓入彈出繼續(xù)后面壓完再彈出。這種方式是錯誤的。

代碼:

(1) 下面這個代碼自己寫的(測試通過),當檢測到第二個序列中的數(shù)字時,并沒有壓入輔助棧,而是忽略,再檢查下一個數(shù)字。這樣省去了入棧出棧的代價。

bool IsPopOrder2(const int* pPush, const int* pPop, int nLength) {if( pPush == NULL || pPop == NULL || nLength <= 0 )return false;stack<int> tempStack;int pushIndex = 0;for( int i=0; i<nLength; ++i ){//輔助棧為空,或者棧頂元素和彈出數(shù)字不相同if( tempStack.empty() || tempStack.top()!=pPop[i] ){for( ; pushIndex<nLength; ++pushIndex ){//彈出數(shù)字前的序列都入棧if( pPush[pushIndex] != pPop[i] ){tempStack.push( pPush[pushIndex] );}else //檢測到彈出數(shù)字時,下次檢測下一位{++ pushIndex;break;}}//當索引到達壓棧序列末端,且最后一位沒有檢測到時,肯定不是此棧的出棧序列if( pushIndex == nLength && pPush[nLength-1]!= pPop[i]){return false;}}else //棧頂元素和彈出數(shù)字相同{tempStack.pop();}}return true; }

(2)附上《劍指offer》中的代碼,按照以上的分析寫的,這樣增加了數(shù)據(jù)入棧出棧,但是每個元素都是從輔助棧彈出的,具有統(tǒng)一性。

bool IsPopOrder(const int* pPush, const int* pPop, int nLength) {bool bPossible = false;if(pPush != NULL && pPop != NULL && nLength > 0){const int* pNextPush = pPush;const int* pNextPop = pPop;std::stack<int> stackData;while(pNextPop - pPop < nLength){// 當輔助棧的棧頂元素不是要彈出的元素// 先壓入一些數(shù)字入棧while(stackData.empty() || stackData.top() != *pNextPop){// 如果所有數(shù)字都壓入輔助棧了,退出循環(huán)if(pNextPush - pPush == nLength)break;stackData.push(*pNextPush);pNextPush ++;}if(stackData.top() != *pNextPop)break;stackData.pop();pNextPop ++;}if(stackData.empty() && pNextPop - pPop == nLength)bPossible = true;}return bPossible; }


總結(jié)

以上是生活随笔為你收集整理的面试题整理6 栈的压入、弹出序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。