栈的弹出、压入序列

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

思路:

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

代码如下:

#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;
}

时间: 2024-10-24 19:15:31

栈的弹出、压入序列的相关文章

栈的弹出压入序列(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为例,首先压入与弹出序列用vector执行,接受需要stack(先进后出),每压入一个元素都需要与与弹出序列判等,如果相等直接pop()

22-判断一个序列是否是另一个序列入栈的弹出序列

题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 解析: 注:当无法抽象的解决问题时,应该给出正面和反面的实例来分析问题,发现规律. 要判断一个输入序列按照顺序压栈出栈,能否得到一个给定的输出序列? 那么我们需要一个栈,来按照给定输出序列的顺序,将输入序列顺序入栈. 如:

[剑指offer] 判断栈的弹出序列

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 输入描述 压入序列 输出描述 判断是否为出栈序列的boolean值 题目分析 解法一 运行时间:26ms 占用内存:629k public class Solution { public boolean IsPopOrder

判断一个序列是否是栈的弹出序列

给定两个序列,判断后一个序列是否是 第一个序列入栈的出栈顺序 学习过在数据结构的人肯定遇到过很多这种题目 比如给定一个序列 如 1 2 3 4 5的入栈序列 问 4 5 3 2 1是不是前者的一个出栈序列 思路 首先看 出栈序列 4 5 3 2 1 第一个元素是4 也就是说入栈时 必须要先找到4 然后出栈在继续找 5 ,可以用一个栈来存储当前的入栈元素 比如在 4出栈是 此时 栈中应该有 1 2 3 因为 入栈顺序为 1 2 3 4 123 在4的前面,所以还继续在栈中 下面以一个表格来表示 步

skynet源码学习 - 从全局队列中弹出/压入一个消息队列过程

学习云风的skynet源码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue *q= Q; uint32_t tail = GP(__sync_fetch_and_add(&q->tail,1)); // only one thread can set the slot (change q->queue[tail] from NULL to queue) if (!_

skynet源代码学习 - 从全局队列中弹出/压入一个消息队列过程

学习云风的skynet源代码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue *q= Q; uint32_t tail = GP(__sync_fetch_and_add(&q->tail,1)); // only one thread can set the slot (change q->queue[tail] from NULL to queue) if (!

数据结构和算法之栈和队列二:栈的压入,弹出序列

当时我在学习这个的时候也是非常不理解这个问题,一个栈的压入和弹出序列的判断一看不就知道了么,还去判断干嘛.只要符合后进先出的规则就行.但是我在这里简单说一下这个压入和弹出序列是怎么回事.就是我们给定假设的两个序列,一个为压入序列,一个为弹出序列.然后我们再通过一个辅助的栈,把压入序列的数据一个一个push()进入临时的辅助栈中,如果栈顶元素刚好和弹出序列的数据一样,那么我们就弹出,如果不一样我们就将压入序列的数据继续压入临时栈中,直到到达序列结束.如果压入序列结束,临时栈全部数据弹出那么就是一个

剑指offer: 栈的压入和弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的) (1)如果下一个弹出的数字刚好是栈顶数字,那么直接弹出:(2)如果一下个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶:(3)如果所有数字都压入栈仍然

栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 顺序为:push[middle]==pop[0];之后只能从middle--或middle++,一旦从end=size-1开始则只能end--. 1 class Solution { 2 public: 3 bool IsPopOrd