LeetCode-验证栈序列

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc2Z1bWF0bw==,size_20,color_FFFFFF,t_70,g_se,x_16

  • 借用示例一数据。

  • 大概思路:创建一个辅助数组a[5],先将pushed[0]存入a[0]中,再将a[0]与popped[0]比较,若不相等,则继续将pushed数组中元素压栈a数组中,若相等,则出栈a数组元素,以此类推,直到pushed数组遍历完。 具体实现:主要是考虑下标问题,关于数组遍历是采用先++还是后++,这里采用先++,因为这样p,q,top,都是实时指向当前值,而后++会使p,q,top指向它的下一个下标,先暂时不管。

  • 起始时我们设置pushed数组下标p=0,popped数组下标q=0,a数组下标top=0,先将pushed[0]存入a[0]中,再将a[0]与popped[0]比较,若不同,则a[++top]=pushed[++p],若相同,则top--,q++,此时p,q,top,都是实时记录当前元素位置的,直到碰到4,与popped数组第一个元素相同,则top--,q++(因为当前元素相同,所以出栈,检验top--的数据和popped数组p++的数进行比较,只有确定了top--的数据和p++的数值不相等时才继续遍历pushed数组,这也是为什么用先++的原因,因为比较a[top-1]与popped[p+1]不同时,可以在a数组当前位置的后一位置继续进行插入操作,而不覆盖当前位置的值。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc2Z1bWF0bw==,size_20,color_FFFFFF,t_70,g_se,x_16

       

那么终止条件是什么?我们知道,即使p指向5了,a数组与popped数组的比较可能还没停止,如果此题返回true,那么top最终值将会是-1,q的值将会是5,如果继续执行程序,数组下标将越界。这时我们只需要将a数组与popped数组比较条件添加一个top>=0即可,退出条件为p==pushedSize-1。

bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
int p=0,q=0,top=0,a[pushedSize];
a[0]=pushed[0];
while(1)
{ 
        if(top>=0&&a[top]==popped[q])
        {
            top--;
            q++;
        }
        else
        {
            if(p==pushedSize-1)
            break;
            a[++top]=pushed[++p];
        }
}
return q==poppedSize;
}

巧妙:http://t.csdn.cn/omZ0z

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值