輸入兩個整數序列。其中一個序列表示棧的push順序, 判斷另一個序列有沒有可能是對應的pop順序。
阿新 • • 發佈:2019-01-21
題目:輸入兩個整數序列。其中一個序列表示棧的push順序,判斷另一個序列有沒有可能是對應的pop順序。為了簡單起見,我們假設push序列的任意兩個整數都是不相等的。
比如輸入的push序列是1、2、3、4、5,那麼4、5、3、2、1就有可能是一個pop系列。
因為可以有如下的push和pop序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
這樣得到的pop序列就是4、5、3、2、1。
比如輸入的push序列是1、2、3、4、5,那麼4、5、3、2、1就有可能是一個pop系列。
因為可以有如下的push和pop序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
這樣得到的pop序列就是4、5、3、2、1。
但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。
思路:個人的解決方法是按照push和pop的序列來構造一個堆疊,如果構造過程中,不滿足條件,那麼就返回false
#include <iostream> using namespace std; bool ifPopMatchPush(int *aPush, int *bPop, int n) { vector<int> vInt; int i = 0, j = 0; for(; i < n && j < n; i ++) { if(aPush[i] != bPop[j]) { vInt.push_back(aPush[i]); } else { while(1) { j ++; if(j >= n) { return true; } if(vInt.back() == bPop[j]) { vInt.pop_back(); } else { break; } } } } if(i == n || i != j) return false; else return true; } int main(int argc, char *argv[]) { int a[5]={1,2,3,4,5}; int b[5]={4,3,5,1,2}; int c[5]={5,4,3,2,1}; cout << "a and b " << ifPopMatchPush(a, b, 5) << endl; cout << "a and c " << ifPopMatchPush(a, c, 5) << endl; return 0; }