zoukankan      html  css  js  c++  java
  • 栈的弹出、压入序列

    题目:判断一数字序列是否为这些数字入栈的一种出栈方式

    思路:

    首先申请一个辅助栈来模拟进栈出栈,然后判断栈顶元素和出栈数字是否一致,不一致则入栈序列依次进栈,直到栈顶元素和出栈数字一致时:弹出栈顶元素,出栈序列的指针后移,当进栈序列最后一位数字进栈并且它和出栈数字不相符的话,证明弹出序列不正确。

    代码如下:

    #include<iostream>
    #include<stack>
    using namespace std;
    bool isorder(const int *push,const int * pop,int length)
    {
        if(push!=NULL && pop!=NULL && length>0)
        {
            bool result=false;
            const int *newpush=push;
            const int *newpop=pop;
            stack<int> data;
            while(newpop-pop<length)
            {
                //如果栈为空或者栈的最上面不等于要弹出的数,则入栈
                if(data.size()==0||*newpop!=data.top())
                {
                    data.push(*newpush);
                    newpush++;
                    //最后一个数已经进栈
                    if(newpush-push>=length)
                    {
                        //如果栈的最上面不等于要弹出的数,而此时最后一个数已经进栈,证明不是出栈序列
                        if(*newpop!=data.top())
                            break;
                    }
                }
                else{
                    //如果要弹出的数字和栈顶元素一致,则栈弹出
                    data.pop();
                    newpop++;
                }
            }
            //如果栈为空并且弹出序列到达末尾,则证明是出栈序列
            if(newpop-pop==length && data.size()==0)
                result=true;
            return result;
        }
    }

    测试代码及运行结果:

    int main()
    {
    int a[5]={1,2,3,4,5};
    int b[5]={4,5,3,2,1};
    int c[5]={4,3,5,1,2};
    cout<<isorder(a,b,5)<<endl;
    cout<<isorder(a,c,5)<<endl;
    return 0;
    }

  • 相关阅读:
    反射获取class的Class
    线程礼让yield和线程的强制执行join
    Lambda表达式
    java中的静态代理
    java多线程中的callable接口实现
    java利用线程并行的方法模拟龟兔赛跑
    java中的多线程
    HTTP 协议之请求格式
    java的反射概述
    Tomcat和servlet的关系
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4579018.html
Copyright © 2011-2022 走看看