【劍指offer】【九度oj】棧的壓入壓出

來源:互聯網
上載者:User
題目描述:

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。

輸入:

每個測試案例包括3行:

第一行為1個整數n(1<=n<=100000),表示序列的長度。

第二行包含n個整數,表示棧的壓入順序。

第三行包含n個整數,表示棧的彈出順序。

輸出:

對應每個測試案例,如果第二個序列是第一個序列的彈出序列輸出Yes,否則輸出No。

範例輸入:
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2
範例輸出:
Yes
No

大體思路:我們可以建立一個輔助棧來儲存入棧的部分序列,可以o(n)的時間複雜度內解決問題。出棧序列的元素首先與輔助棧(若不空)的棧頂元素比較,若不等再與入棧序列的元素比較。若與入棧序列的元素仍不相等,則當前入棧序列的元素進入輔助棧,出棧序列的當前元素與入棧序列的後面元素繼續比較。若輔助棧的棧頂元素和入棧序列的全部元素都不與出棧序列的當前元素相等,則該序列不是一個正確的出棧序列;若所有出棧序列元素都比較完,則是一個正確的出棧序列。

代碼如下:

#include <iostream>#include <algorithm>#include <string>#include <stack>using namespace std;int a[100010],b[100010];stack<int> s;int main(){int n,i,j;while(cin>>n){for( i=0; i<n; i++ )cin>>a[i];for( i=0; i<n; i++ )cin>>b[i];i=j=0;while( !s.empty() )  //這個很關鍵,因為有多個測試案例,所以需要清空上個測試案例的棧。s.pop();while(i<=n){if( !s.empty() && b[j]==s.top() ){s.pop();j++;}else{if( i==n )break;if( b[j]==a[i] ){i++;j++;}else{s.push(a[i]);i++;}}}if( j == n )cout<<"Yes"<<endl;elsecout<<"No"<<endl;}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.