胡同+栈的压入、弹出序列 c++

这篇博客探讨了两个与数据结构栈和队列相关的问题。第一个问题是判断给定的压栈和弹出序列是否合法,涉及栈的特性。第二个问题是一个汽车死胡同的场景,需要确定汽车能否按照特定顺序倒退出去,利用了栈和队列的特性来解决。这两个问题都展示了栈和队列在实际问题解决中的应用。
摘要由CSDN通过智能技术生成

栈的经典例题  “判断栈出顺序是否合理”

两道例题

描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

1. 0<=pushV.length == popV.length <=1000

2. -1000<=pushV[i]<=1000

3. pushV 的所有数字均不相同

示例1

输入:

[1,2,3,4,5],[4,5,3,2,1]

返回值:

true

说明:

可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列,返回true      

示例2

输入:

[1,2,3,4,5],[4,3,5,1,2]

返回值:

false

说明:

由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false      
class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
       int s1=pushV.size();
        stack<int>s;
        int j=0;
        for(int i=0;i<s1;i++)
        {
            while(j<s1 && (s.empty() || s.top()!=popV[i]))
            {
                s.push(pushV[j]);
                j++;
            }
            if(s.top()==popV[i])
            {
                s.pop();
            }
            else
            {
                return false;
            }
        }
       return true;
    }
};

这个是用了核心代码模式

第二个例题

有一个死胡同,宽度刚好只能让一辆汽车通过,偏偏老有汽车开到死胡同来,这下麻烦了,最先开来的汽车要最后才能倒退出去。给定一个汽车开来的序列和一个可能的倒车出去的序列,请判断汽车能否都倒退出去,若能则输出Yes,否则输出No。

输入格式:

首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据首先输入一个正整数n(n≤10),代表开来的汽车数,然后输入2n个整数,其中,前n个整数表示汽车开来的序列,后n个整数表示汽车可能倒出的序列。

输出格式:

对于每组测试,判断能否倒车出该死胡同,若能则输出“Yes”,否则输出“No”。引号不必输出。

输入样例:

2
4 1 2 3 4 2 1 4 3
4 1 2 3 4 4 2 1 3

输出样例:

Yes
No

提示:

样例1的可能方案为:1进,2进,2出,1出,3进,4进,4出,3出。

#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>

using namespace std;

int main()
{
	int t;
	cin>>t;
	while(t)
	{
		int n;
		int x;
		int y;
        int a[1000];
		cin>>n;
		stack<int>astack; 
		queue<int>aqueue;
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
		 } 
		 for(int i=0;i<n;i++)
		 {
		 	cin>>y;
		 	aqueue.push(y);
		 }
		 for(int i=0;i<n;i++)
		 {
             astack.push(a[i]);
		 	while(!astack.empty() && aqueue.front() == astack.top())
			{
				aqueue.pop();
				astack.pop();
			}
		 }
		
		if(astack.empty())
		{
			cout<<"Yes"<<endl;
		}
		else
		{
			cout<<"No"<<endl;
		}
		t--;
	}
}

绍文理的题

用的是栈+队列

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值