【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();
    }
}

结语

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

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

相关推荐
人机1012 分钟前
Spring Security - FilterChainProxy
java
SimonKing33 分钟前
Apache Commons Math3 使用指南:强大的Java数学库
java·后端·程序员
渣哥34 分钟前
Java 集合迭代中的 fail-fast 与 fail-safe 机制详解
java
帧栈37 分钟前
我的创作纪念日
java
kk”1 小时前
C语言快速排序
数据结构·算法·排序算法
纪元A梦1 小时前
贪心算法应用:基因编辑靶点选择问题详解
算法·贪心算法
3壹1 小时前
数据结构精讲:栈与队列实战指南
c语言·开发语言·数据结构·c++·算法
bug攻城狮1 小时前
Spring Boot Banner
java·spring boot·后端
黑马源码库miui520862 小时前
JAVA同城打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
java·微信·微信小程序·小程序·uni-app
skytier2 小时前
Construct内报错和定位解决
算法