【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
序列生成。
- 使用一个栈来模拟入栈过程。
- 遍历
pushed
序列,将元素依次压入栈中。 - 在压栈的同时,检查栈顶元素是否与
poped
序列的当前索引位置的元素相同。 - 如果相同,弹出栈顶元素,并移动到
poped
序列的下一个元素。 - 重复步骤3和4,直到遍历完
pushed
序列。 - 如果在任何时候栈顶元素与
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();
}
}
结语
本题是一个典型的栈应用问题,通过模拟栈的操作,我们可以验证两个序列是否匹配。希望这篇博客能帮助你更好地理解栈的工作原理以及如何在实际问题中应用栈。如果你有任何问题或建议,请在下方留言,我会尽快回复。
版权声明:本博客内容为原创,转载请保留原文链接及作者信息。