棧的壓入,彈出序列 輔助棧 思維

傳送門

分析:藉助輔助棧,遍歷出棧序列的時候,每一個元素要麼在輔助棧的棧頂,要麼還沒有入棧,這時從入棧序列中找到這個值,並把它前面的元素全部入棧,這時它作爲棧頂,符合出棧序列,如果遍歷結束入棧序列還未找到這個值,那麼出棧序列不符合要求,返回false。

注意防禦性編程,當兩個序列爲空指針時的情況,長度不同的情況等等

注意第22行的條件,調試的時候出錯。

//設置輔助棧   創建兩個指針,分別指向壓棧和彈棧序列
class Solution {
private:
    stack<int>st;
public:
    Solution()
    {
        while(!st.empty()) st.pop();
    }
    ~Solution()
    {
        
    }
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        //防禦性編程
        int len1 = pushV.size(),len2 = popV.size();
        if(len1<=0||len2<=0||len1!=len2) return false;
        int i=0,j=0;
        while(j<len2)
        {
            //首先判斷彈棧序列當前值是否在棧頂
            if(!st.empty()&&popV[j]==st.top()) {
                st.pop();
                j++;
                continue;
            }
            //如果不在棧頂,那麼要到壓棧序列中找到這個值,把它之前的值全部入棧,把它作爲棧頂元素
            bool flag = false;
            while(i<len1)
            {
                st.push(pushV[i]);
                if(pushV[i]==popV[j]) {
                    flag = true;
                    break;
                }
                i++;
            }
            if(!flag) return false;
            st.pop();
            i++,j++;
        }
        return true;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章