zoukankan      html  css  js  c++  java
  • 《剑指offer》第三十一题(栈的压入、弹出序列)

    // 面试题31:栈的压入、弹出序列
    // 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是
    // 否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、
    // 5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但
    // 4、3、5、1、2就不可能是该压栈序列的弹出序列。
    
    #include <iostream>
    #include <stack>
    
    bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
    {
        bool bPossible = false;
    
        if (pPush != nullptr && pPop != nullptr && nLength > 0)
        {
            const int* pNextPush = pPush;
            const int* pNextPop = pPop;
    
            std::stack<int> stackData;
    
            while (pNextPop - pPop < nLength)
            {
                // 当辅助栈的栈顶元素不是要弹出的元素
                // 先压入一些数字入栈
                while (stackData.empty() || stackData.top() != *pNextPop)
                {
                    // 如果所有数字都压入辅助栈了,退出循环
                    if (pNextPush - pPush == nLength)
                        break;
    
                    stackData.push(*pNextPush);
    
                    pNextPush++;
                }
    
                if (stackData.top() != *pNextPop)//完了,不匹配
                    break;
    
                stackData.pop();//弹出这个匹配的
                pNextPop++;//检测下一个要pop的
            }
    
            if (stackData.empty() && pNextPop - pPop == nLength)//检测条件
                bPossible = true;
        }
    
        return bPossible;
    }
    
    // ====================测试代码====================
    void Test(const char* testName, const int* pPush, const int* pPop, int nLength, bool expected)
    {
        if (testName != nullptr)
            printf("%s begins: ", testName);
    
        if (IsPopOrder(pPush, pPop, nLength) == expected)
            printf("Passed.
    ");
        else
            printf("failed.
    ");
    }
    
    void Test1()
    {
        const int nLength = 5;
        int push[nLength] = { 1, 2, 3, 4, 5 };
        int pop[nLength] = { 4, 5, 3, 2, 1 };
    
        Test("Test1", push, pop, nLength, true);
    }
    
    void Test2()
    {
        const int nLength = 5;
        int push[nLength] = { 1, 2, 3, 4, 5 };
        int pop[nLength] = { 3, 5, 4, 2, 1 };
    
        Test("Test2", push, pop, nLength, true);
    }
    
    void Test3()
    {
        const int nLength = 5;
        int push[nLength] = { 1, 2, 3, 4, 5 };
        int pop[nLength] = { 4, 3, 5, 1, 2 };
    
        Test("Test3", push, pop, nLength, false);
    }
    
    void Test4()
    {
        const int nLength = 5;
        int push[nLength] = { 1, 2, 3, 4, 5 };
        int pop[nLength] = { 3, 5, 4, 1, 2 };
    
        Test("Test4", push, pop, nLength, false);
    }
    
    // push和pop序列只有一个数字
    void Test5()
    {
        const int nLength = 1;
        int push[nLength] = { 1 };
        int pop[nLength] = { 2 };
    
        Test("Test5", push, pop, nLength, false);
    }
    
    void Test6()
    {
        const int nLength = 1;
        int push[nLength] = { 1 };
        int pop[nLength] = { 1 };
    
        Test("Test6", push, pop, nLength, true);
    }
    
    void Test7()
    {
        Test("Test7", nullptr, nullptr, 0, false);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        Test7();
        system("pause");
        return 0;
    }
  • 相关阅读:
    hash算法
    TCP/IP四层与OSI七层模型
    di
    VSCode安装程序——java开发
    java中的多线程
    C#ThreadPool类—多线程
    学习-思考
    DataTable通过Select进行过滤
    javascript遍历对象属性
    WebClient 与HttpClient 的区别
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10492473.html
Copyright © 2011-2022 走看看