ACM_栈的压入、弹出序列
Problem Description:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
Input:
输入一个T,表示理面输入T组数据。每组数据第一行为一个数n,接下来有两行n个数字,第一行代表数字进栈的序列,第二行代表数字出栈的序列。(所有数字不大于50)
Output:
判断出栈序列能不能由进栈序列产生,如果能输出YES,否则输出NO。
Sample Input:
2
5
1 2 3 4 5
4 5 3 2 1
5
1 2 3 4 5
4 3 5 1 2
Sample Output:
YES
NO
解题思路:借用一个额外的辅助栈
举个栗子:
①入栈Push序列:1,2,3,4,5
②出栈Pop序列:4,5,3,2,1
遍历压栈顺序,先将第一个放入辅助栈中,这里是1,然后判断辅助栈的栈顶元素是不是出栈Pop顺序的第一个元素,这里是4,很显然1≠4,所以我们继续将元素压入辅助栈中,直到相等后辅助栈就开始出栈,出栈一个(栈顶元素)元素,则将出栈Pop顺序向后移动一位,直到不相等,这样一直循环,直到压栈顺序遍历完成,如果这时辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
简单模拟一下过程:首先1入辅助栈,此时栈顶1≠4,继续入栈2,此时栈顶2≠4,继续入栈3,此时栈顶3≠4,继续入栈4,此时栈顶4==4,出栈4,弹出序列的位置向后移一位,此时为5,辅助栈里面是1,2,3,此时栈顶3≠5,继续入栈5,此时栈顶5==5,出栈5,弹出序列向后一位,此时为3,辅助栈里面是1,2,3….依次执行,最后判断辅助栈为空,若不为空说明弹出序列不是该栈的弹出顺序。
AC代码:
#include <iostream>
#include <vector>
using namespace std;
bool IsPopOrder(vector<int> Push, vector<int> Pop) {
if(Push.size()==)return false;
vector<int> vec;//辅助容器
for(size_t i=,j=;i<Push.size();++i){
vec.push_back(Push[i]);
while(j<Pop.size()&&Pop[j]==vec.back()){vec.pop_back();j++;}
}
return vec.empty();//如果最后vec容器中元素个数为0,说明出栈序列满足条件,返回true
}
int main(){
vector<int> pushlist;
vector<int> poplist;
int t,n,x;
cin>>t;
while(t--){
pushlist.clear();//清空
poplist.clear();
cin>>n;
for(int i=;i<=n;++i){cin>>x;pushlist.push_back(x);}
for(int i=;i<=n;++i){cin>>x;poplist.push_back(x);}
if(IsPopOrder(pushlist, poplist))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return ;
}
ACM_栈的压入、弹出序列的更多相关文章
- 【剑指offer】栈的压入弹出序列,C++实现(举例)
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...
- 剑指offer - 栈的压入弹出序列 - JavaScript
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...
- 剑指offer-面试题22.栈的压入,弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第 二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等. 例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1 是该压栈 ...
- 剑指Offer20 栈的压入弹出序列是否正确
/************************************************************************* > File Name: 20_IsPopO ...
- 剑指offer-栈的压入弹出序列21
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- 剑指offer-面试题31-栈的压入弹出序列-栈
#include<iostream> #include<string.h> #include<algorithm> #include<cmath> #i ...
- 剑指offer 栈的压入弹出 顺序
判断: 如果下一个弹出的数字刚好是栈顶元素,那么直接弹出 如果下一个弹出的数字不在栈顶,我们要把压栈序列中,还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶 如果所有的数字都入栈,但是仍 ...
- redis list 查询、下标查询、删除、裁剪、压入弹出、队列实现
查询 lrange list 0 1 // 注意0和1之间是空格:这个命令和pop命令不一样,不会删除里面的值lrange list 0 -1 // 所有的 下标查询 lpush person zs ...
- 剑指Offer(二十一):栈的压入、弹出序列
剑指Offer(二十一):栈的压入.弹出序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
随机推荐
- [bzoj1867][Noi1999][钉子和小球] (动态规划)
Description Input 第1行为整数n(2<=n<=50)和m(0<=m<=n).以下n行依次为木板上从上至下n行钉子的信息,每行中‘*’表示钉子还在,‘.’表示钉 ...
- pogresql基础学习笔记
命令行工具:psql 可视化工具:pgAdmin 查看所有表: 命令行:\d sql:select * from pg_tables WHERE schemaname='public'; 查看表结构: ...
- 这可能是vue-cli最全的解析了……
题言: 相信很多vue新手,都像我一样,只是知道可以用vue-cli直接生成一个vue项目的架构,并不明白,他究竟是怎么运行的,现在我们一起来研究一下... 一.安装vue-cli,相信你既然会用到v ...
- 九度oj 题目1066:字符串排序
题目1066:字符串排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6487 解决:2670 题目描述: 输入一个长度不超过20的字符串,对所输入的字符串,按照ASCII码的大小从小到 ...
- Failed to load slave replication state from table mysql.gtid_slave_pos: 1146: Table 'mysql.gtid_slave_pos' doesn't exist
http://anothermysqldba.blogspot.com/2013/06/mariadb-1003-alpha-install-on-fedora-17.html MariaDB 10. ...
- code wars quiz: toInteger
Your task is to program a function which converts any input to an integer. Do not perform rounding, ...
- DJANGO中如何用邮箱来登陆?
就是另一个不同的登陆backend. 而DJANGO会尝不同的方式,哪个成功就用哪个 authentication.py from django.contrib.auth.models import ...
- 5-14 电话聊天狂人 (25分) HASH
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数NN(\le 10^5≤105),为通话记录条数.随后NN行,每行给出一条通话记录.简单起见,这里只列出 ...
- JNA调用库文件
最近项目中要集成厂商的卡口摄像头,需要通过jna调用库函数接收卡口相机抓拍的过车数据.本文记录了Java调用C语言动态库(jna)的调用方式.回调函数.结构体等. JNA全称Java Native A ...
- [bzoj1607][Usaco2008 Dec]Patting Heads 轻拍牛头_筛法_数学
Patting Heads 轻拍牛头 bzoj-1607 Usaco-2008 Dec 题目大意:题目链接. 注释:略. 想法:我们发现,位置是没有关系的. 故,我们考虑将权值一样的牛放在一起考虑,c ...