洛谷 —— P4387验证栈序列

一、题目

(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写,注意两点

三、代码

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

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值