剑指Offer的学习笔记(C#篇)-- 栈的压入、弹出序列

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

一 . 理解题意

        做好此题的关键在于读懂题目的意思,做了部分题目后发现,该题属于一个不易理解的题目,现在用俗话来解释一下。两个内容是一样,但顺序不同的序列,其中一个是入栈,一个是出栈,(可以边入边出),让你判断一下,出栈的那个对应的到底是不是入栈的那个。看下图,实例化解释一下。

        假设,我入栈的序列是1,2,3,4,5,我可以通过以上的步骤弹出4,5,3,2,1。这就说明4,5,3,2,1是刚才那个栈的弹出序列。那我们在举个反例!看下图。

        假设,你压入的是1,2,3,4,5,这时候你想弹出4,3,5,1,2,这个时候呢,你操作一下,是绝对无法输出4,3,5,1,2,极限也就输出个4,3,5,21,(这是和栈的特性挂钩的)。

        因此,谈论一下具体的操作步骤,首先两个序列是给定的(假设一个叫弹入序列,一个叫弹出序列),先看看弹出序列的第一个数是什么,因为栈的特性是先进后出,这个时候呢,就需要你把弹出序列的第一个数从弹入序列的开头进行比对,如果刚好相等,你就把他弹进去,再弹出来;如果不相等,依旧弹进去,然后再和下一个对比,进行循环。就像上面表格里的一样,如果你最后弹出的序列和理想的弹出序列一致,证明他是对应的弹出序列,否则就不是咯。

二 . 代码实现

using System.Collections.Generic;
class Solution
{
    public bool IsPopOrder(int[] pushV, int[] popV)
    {
        // write code here
        //定义一个栈a,定义一个常数i=0
        Stack<int> a = new Stack<int>();
        int i =0;
        //循环体操作进栈
        for (int j = 0;j<pushV.Length;j++)
        {
            a.Push(pushV[j]);
            //满足i<popV的长度以及第i个出栈数等于顶栈的数执行出栈
            while(i<popV.Length && popV[i]==a.Peek())
            {
                a.Pop();
                i++;
            }
        }
        //输出
        if(a.Count == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

        哇,说实在的,我好讨厌这个题目,我感觉我思路是对的,用了两个for循环,但是提示不是所有代码都会返回value值,哇,搞得我一头雾水,不过上面的代码的确蛮容易懂的,逻辑能力还是次啊!!!!

posted @ 2019-05-22 16:06  WeiMLing  阅读(417)  评论(0编辑  收藏  举报