1. 程式人生 > >輸入兩個整數序列。其中一個序列表示棧的push順序, 判斷另一個序列有沒有可能是對應的pop順序。

輸入兩個整數序列。其中一個序列表示棧的push順序, 判斷另一個序列有沒有可能是對應的pop順序。

題目:輸入兩個整數序列。其中一個序列表示棧的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。

但序列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;
}