一、题目
(1)题目描述
给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n\le100000)n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据。
(2)输入格式
第一行一个整数 q,询问次数。
接下来 q 个询问,对于每个询问:
第一行一个整数 n 表示序列长度;
第二行 n 个整数表示入栈序列;
第二行 n 个整数表示出栈序列;
(3)输出格式
对于每个询问输出答案。
(4)输入输出样例
二、分析
- 数据量不大,直接STL模拟一下就行
- 开一个辅助栈 S,如果下一个poped(从底数向上一个一个数)的数字恰好是辅助栈 S 的栈顶数字,那就直接弹出,否则就从pushed序列向 S 里面按照序列扔进去直到 S 的栈顶是 B 想要的那个数。如过pushed序列都过完了还是不能满足这件事,就说明这个序列不合法。
- 注意一下坑点:对于每一个新的询问,先清空辅助栈
- 如果用java写,注意两点
- java的
Sacnner
输入太慢了会超时,参考:使用Java语言刷OJ经常超时的解决办法 - 输出Yes/No的时候,写
System.out.println("Yes")
已经自带回车了,不要加\n
,否则oj会判断为错误输出
- java的
三、代码
(1) C++
#include <iostream>
#include <stack>
using namespace std;
int pushed[100000+5];
int poped[100000+5];
int main()
{
int N;
cin>>N;
stack<int> st;
for(int i=0;i<N;i++)
{
int l;
cin>>l;
for(int j=0;j<l;j++)
cin>>pushed[j];
for(int j=0;j<l;j++)
cin>>poped[j];
int push,pop;
push=pop=0;
while(pop<l && push<l)
{
st.push(pushed[push]);
push++;
while(!st.empty() && poped[pop] == st.top()) //注意这里,必须在非空的情况下使用top()方法,组合条件的短路特性正好满足这一点
{
st.pop();
pop++;
}
}
if(pop==l)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
while(!st.empty()) //注意清空辅助栈,这里没清,80分
st.pop();
}
return 0;
}
(2) JAVA
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws IOException
{
int pushed[] = new int[100000+5];
int poped[] = new int[100000+5];
int N = Reader.nextInt();
Stack<Integer> stack = new Stack<>();
for(int i=0;i<N;i++)
{
int l = Reader.nextInt();
for(int j=0;j<l;j++)
pushed[j] = Reader.nextInt();
for(int j=0;j<l;j++)
poped[j] = Reader.nextInt();
int push;
int pop;
push = pop = 0;
while(pop<l && push<l)
{
stack.push(pushed[push]);
push++;
while(!stack.empty() && poped[pop] == stack.peek())
{
stack.pop();
pop++;
}
}
if(pop==l)
System.out.println("Yes\n");
else
System.out.println("No\n");
while(!stack.empty()) //注意清空辅助栈,这里没清,80分
stack.pop();
}
}
//快速输入方法,如果不用这个会超时
static class Reader {
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokenizer = new StringTokenizer("");
static String nextLine() throws IOException{// 读取下一行字符串
return reader.readLine();
}
static String next() throws IOException {// 读取下一个字符串
while (!tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException {// 读取下一个int型数值
return Integer.parseInt(next());
}
static double nextDouble() throws IOException {// 读取下一个double型数值
return Double.parseDouble(next());
}
}
}