• 栈的压入,弹出序列


    面试题 22:栈的压入弹出序列,假设压入栈的所有数字都不相等,第一个序列表示压入顺序,第二个为弹出顺序,判断两个顺序是否相对应。

    下面我根据海涛大神的思路自己写代码实现功能

    关键思路指点:当前要弹出的数字不在栈中,就把当前压入序列的数字至要弹出的数字压入栈中,然后弹出要弹出的数字,最后如果栈为空,就说明序列对应,否则不对应

    #include<iostream>
    #include<stack>
    using namespace std;
    
    bool testStack(int *pushSequece, int pushLength, int *popSequece, int popLength){
        //讨论异常情况,如两个长度不相同,或传入空指针
        int pushBegin,popBegin;
        stack<int> mystack;
        pushBegin = popBegin = 0;
        int i;
        for (; popBegin < popLength; popBegin++){
            if (!mystack.size()){
                //stack 为空
                for (i = pushBegin; i < pushLength; i++){
                    if (pushSequece[i] == popSequece[popBegin])
                        break;
                }
                if (i == pushLength) return false;
                for (int j = pushBegin; j <= i; j++){
                    mystack.push(pushSequece[j]);
                }
                pushBegin = i + 1;
                mystack.pop();
            }else {
                if (mystack.top() != popSequece[popBegin]){
                    //如果top元素不为当前遍历popSequece的元素
                    for (i = pushBegin; i < pushLength; i++){
                        if (pushSequece[i] == popSequece[popBegin])
                            break;
                        
                    }
                    if (i == pushLength) return false;
                    for (int j = pushBegin; j <= i; j++){
                        mystack.push(pushSequece[j]);
                        cout << "测试2" << endl;
                        
                    }
                    pushBegin = i + 1;
                    mystack.pop();
                }else{
                    mystack.pop();
                }
                
            }
            
        }
        if (mystack.size() == 0)
            return true;
    
    
    }
    int main(){
        
        int push[] = { 1, 2, 3, 4, 5 };
        int length = sizeof(push) / sizeof(int);
        int pop1[] = { 4, 5, 3, 2, 1 };
        int pop2[] = { 4, 3, 5, 1, 2 };
        int pop3[] = { 1, 2, 3, 4, 5 };
        int pop4[] = { 3, 2, 5, 4, 1 };
        int pop5[] = { 3, 5, 2, 1, 4 };
        if (testStack(push, length, pop1, length))
            cout << "符合条件"<<endl;
        if (!testStack(push, length, pop2, length))
            cout << "不符合条件"<<endl;
        if (testStack(push, length, pop4, length))
            cout << "符合条件" << endl;
        if (!testStack(push, length, pop5, length))
            cout << "不符合条件" << endl;
    
        system("pause");
    }

    关键思路指点:当前要弹出的数字不在栈中,就把当前压入序列的数字至要弹出的数字压入栈中,然后弹出要弹出的数字,最后如果栈为空,就说明序列对应,否则不对应

  • 相关阅读:
    Exchanger
    信号量Semaphore
    CountDownLatch
    Condition
    WCF接口实例介绍
    时间显示
    pymysql-execute
    python之迭代器与生成器
    python之装饰器
    python之函数
  • 原文地址:https://www.cnblogs.com/hzmbbbb/p/3980579.html
Copyright © 2020-2023  润新知