数据结构与算法面试题80道(29)

29.栈的pushpop序列             

题目:输入两个整数序列。其中一个序列表示栈的push顺序,

判断另一个序列有没有可能是对应的pop顺序。

为了简单起见,我们假设push序列的任意两个整数都是不相等的。 

 

比如输入的push序列是12345,那么45321就有可能是一个pop系列。

因为可以有如下的pushpop序列:

push 1push 2push 3push 4poppush 5poppoppoppop

这样得到的pop序列就是45321

但序列43512就不可能是push序列12345pop序列。

 

思路:如果栈为空栈,或栈顶元素不等于pop序列的当前值,那么就将push序列的第一个元素放入栈顶,push序列指针后移。

如果栈顶元素等于pop序列的当前值,弹出栈顶元素并将pop指针后移。

 

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<stack>
using namespace std;

bool hasPop(int in[],int out[],int length,int length2){
    if(length2>length) return false;//out序列长度比in序列大,肯定不是
    stack<int>s;
    int pushnum=0,popnum=0;
    bool flag=false;
    while(pushnum!=length){//这里一定要是pushnum!=length
        while(s.empty()||s.top()!=out[popnum]){
            s.push(in[pushnum]);
            pushnum++;
            if(pushnum==length) break;//in序列循环完了,没有数可以进入栈,直接结束
        }
        while(!s.empty()&&s.top()==out[popnum]){
            s.pop();
            popnum++;
            if(popnum==length2) break;//避免超出数组
        }
//当pushnum==length时,只有popnum==length2才为真,不然为假,这里可以想想
if(popnum==length2) flag=true; } return flag; } int main(){ int in[]={1,2,3,4,5}; int out[]={4,5,3,2,1}; int length=sizeof(in)/(sizeof(in[0])); int length2=sizeof(out)/sizeof(out[0]); if(hasPop(in,out,length,length2)) cout<<"是的"<<endl; else cout<<"不是"<<endl; return 0; }

 

转载于:https://www.cnblogs.com/wabi87547568/p/5274924.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值