zoukankan      html  css  js  c++  java
  • 判断一个序列是否为栈的弹出序列

      题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

    例如 序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序

    列的弹出序列。

    Hint 

      解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈

    中弹出数字。 以弹出序列4、5、3、2、1为例分析压栈和弹出的过程。第一个希望被弹出的数字是4,因此4需要先压入到辅助栈里面。压入栈的

    顺序由压栈序列确定了,也就是在把4压入进栈之前,数字1、2、3都需要先压入到栈里面。此时栈里包含4个数字,分别是1、2、3、4,其中4位

    于栈顶。把4 弹出栈后,剩下的三个数字是1、2和3。接下来希望被弹出的数字是5,由 于它不是栈顶数字,因此我们接着在第一个序列中把4以

    后数字压入辅助栈 中,直到压入了数字5。这个时候5位于栈顶,就可以被弹出来了。接下来 希望被弹出的三个数字依次是3、2和1。由于每次操

    作前它们都位于栈顶, 因此直接弹出即可。

    Algorithm

    1.  如果下一个弹出的数字刚好再栈顶,那么弹出该数字;

             2. 如果下一个要弹出的数字不在栈顶,则在压栈的数据中压入数据直到压入要弹出的数据停止;

             3. 如果所有的数据都已压入栈内,但是下一个要弹出的数字不在栈顶,那么该出栈序列不可能是该栈的一个弹出序列。

             4. 最后栈空, 则该序列是该栈的一个弹出序列。

    bool check(int ip[], int op[], int n) 
    { 
        queue<int> input; 
        for (int i=0;i<n;i++) 
            input.push(ip[i]); 
        queue<int> output; 
        for (int i=0;i<n;i++) 
            output.push(op[i]); 
        stack <int> tempStack; 
        while (!input.empty()) 
        { 
            int ele = input.front(); 
            input.pop(); 
            if (ele == output.front()) 
            { 
                output.pop(); 
                while (!tempStack.empty()) 
                { 
                    if (tempStack.top() == output.front()) 
                    { 
                        tempStack.pop(); 
                        output.pop(); 
                    } 
                    else
                        break; 
                } 
            } 
            else
                tempStack.push(ele); 
        } 
        return (input.empty()&&tempStack.empty()); 
    } 
  • 相关阅读:
    回顾2011,展望我的2012
    查看MS SQL SERVER数据库中表的大小
    MS SQL SERVER数字格式化显示,每三位加逗号
    MS SQL Server 保留一行,清除多余冗余数据
    ASP.NET Webform和ASP.NET MVC的区别
    Firefox的刷新功能与Safari,IE的差距
    TIOBE如何计算编程语言的排行?
    如何让ComboBox的下拉列表宽度自适应内容的宽度
    如何启用.NET中的Fusion Log
    JavaScript的clone函数的实现及应用条件
  • 原文地址:https://www.cnblogs.com/xielei/p/10533072.html
Copyright © 2011-2022 走看看