给出入栈序列,同时给出出栈序列,怎么判断出栈序列是不是正确的

给出入栈序列,同时给出出栈序列,怎么判断出栈序列是不是正确的?

相信这道题在笔试中经常出现,那么编程如何实现,大致思路如下:
比如现在给出入栈序列,1->2->3->4->5,出栈序列2->3->5->4->1

  1. 我们首先拿到一个栈,按照入栈顺序将第一个元素放入栈中,此时栈中有元素1,栈顶元素1
  2. 紧接着我们判断此时栈顶元素是否等于出栈序列的第一个元素,1≠2,继续入栈新的元素
  3. 此时2入栈,栈中有1,2,2位于栈顶,再执行和出栈序列第一个元素判断的操作,2=2,将2出栈,此时出栈序列将2拿走,剩余3->5->4->1
  4. 此时3入栈,栈中有1,3,3位于栈顶,此时3与出栈序列第一个元素判断,3=3,将3出栈,出栈序列将3拿走,剩余5->4->1
  5. 此时4入栈,栈中有1,4,4位于栈顶,此时4与出栈序列第一个元素判断,4≠5,继续入栈新元素
  6. 此时5入栈,栈中共有1,4,5,5位于栈顶,此时5与5相等,5出栈,出栈序列将5拿走,剩余4->1,栈顶元素为4,4与出栈序列第一个元素判断,4=4,4出栈,同时出栈序列将4拿走,剩余1,栈中只剩最后一个元素1,此时恰好等于最后一个出栈元素1

即可知,在入栈序列为1->2->3->4->5的条件下,出栈序列2->3->5->4->1是一个合法的出栈序列

核心思路在于,判断栈顶元素是否等于此时出栈序列的第一个元素,若是,则执行出栈操作,同时指针后移,若否,继续入栈新的元素,继续执行判断操作。

实现代码如下:

import java.util.Stack;

/**
 * @author F3ver1
 * @date 2019/4/24 21:37
 */
public class Main {
    public static void main(String[] args) {
        String push = "12345";
        String pop = "23541";
        System.out.println(PopSerial(push, pop));
    }

    public static boolean PopSerial(String push, String pop) {
        if (push == null || pop == null || (push.length() != pop.length())) {
            return false;
        }
        int pushLen = push.length();
        int popLen = pop.length();
        Stack<Character> stack = new Stack<>();
        int pushIndex = 0;             //记录入栈指针
        int popIndex = 0;              //记录出栈指针
        while (pushIndex < pushLen) {
            stack.push(push.charAt(pushIndex));
            pushIndex++;
            //核心判断条件
            while (!stack.isEmpty() && (stack.peek() == pop.charAt(popIndex))) {
                stack.pop();
                popIndex++;
            }
        }
        //当指针走完整个序列长时,退出并给出结果
        if (stack.isEmpty() && popIndex == popLen) {
            return true;
        } else {
            return false;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值