【P4387 【深基15.习9】验证栈序列 java版本

【P4387 【深基15.习9】验证栈序列 java版本

题目描述

给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n ( n ≤ 100000 ) n(n\le100000) n(n100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据,不超过 5 5 5 组。

输入格式

第一行一个整数 q q q,询问次数。

接下来 q q q 个询问,对于每个询问:

第一行一个整数 n n n 表示序列长度;

第二行 n n n 个整数表示入栈序列;

第三行 n n n 个整数表示出栈序列;

输出格式

对于每个询问输出答案。

样例 #1

样例输入 #1

2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3

样例输出 #1

Yes
No

算法分析

解决这个问题的关键在于理解栈的后进先出(LIFO)特性。我们可以模拟栈的入栈和出栈操作来验证 poped 序列是否可能由 pushed 序列生成。

  1. 使用一个栈来模拟入栈过程。
  2. 遍历 pushed 序列,将元素依次压入栈中。
  3. 在压栈的同时,检查栈顶元素是否与 poped 序列的当前索引位置的元素相同。
  4. 如果相同,弹出栈顶元素,并移动到 poped 序列的下一个元素。
  5. 重复步骤3和4,直到遍历完 pushed 序列。
  6. 如果在任何时候栈顶元素与 poped 序列不匹配,或者在遍历完 pushed 序列后栈不为空,则输出 No;否则输出 Yes

代码实现

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StreamTokenizer;
import java.util.Stack;

public class Main {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
    static StreamTokenizer st = new StreamTokenizer(in);

    public static void main(String[] args) throws IOException {
        st.nextToken();
        int t = (int) st.nval;
        while (t-- > 0) {
            st.nextToken();
            int n = (int) st.nval;
            int[] arr = new int[n];
            int[] now = new int[n];
            for (int i = 0; i < n; i++) {
                st.nextToken();
                arr[i] = (int) st.nval;
            }
            for (int i = 0; i < n; i++) {
                st.nextToken();
                now[i] = (int) st.nval;
            }
            Stack<Integer> stack = new Stack<>();
            int index = 0;
            for (int i = 0; i < n; i++) {
                stack.push(arr[i]);
                while (!stack.isEmpty() && stack.peek() == now[index]) {
                    index++;
                    stack.pop();
                }
            }
            if (stack.isEmpty()) {
                out.write("Yes\n");
            } else {
                out.write("No\n");
            }
        }
        out.flush();
    }
}

结语

本题是一个典型的栈应用问题,通过模拟栈的操作,我们可以验证两个序列是否匹配。希望这篇博客能帮助你更好地理解栈的工作原理以及如何在实际问题中应用栈。如果你有任何问题或建议,请在下方留言,我会尽快回复。

版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值