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

文章目录

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

题目描述

给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n ( n ≤ 100000 ) n(n\le100000) n(n≤100000)。已知入栈序列是 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

代码实现

java 复制代码
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();
    }
}

结语

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

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

相关推荐
Rabitebla7 分钟前
【C++】string 类:原理、踩坑与对象语义
linux·c语言·数据结构·c++·算法·github·学习方法
小雅痞1 小时前
[Java][Leetcode middle] 167. 两数之和 II - 输入有序数组
java·算法·leetcode
CN-Dust1 小时前
【C++】输入cin例题专题
java·c++·算法
数模竞赛Paid answer2 小时前
2025年MathorCup数学建模A题汽车风阻预测解题文档与程序
算法·数学建模·mathorcup
xin_nai2 小时前
LeetCode热题100(Java)(6)矩阵
java·leetcode·矩阵
代码AI弗森8 小时前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
Old Uncle Tom8 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆8 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
小小小米粒8 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
生信碱移8 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言