牛客网剑指offer第21题——判断出栈序列是否是入栈序列
题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
先上通过的代码:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
bool isoder = false;
int i = ;
int j = ;
stack<int> pushs;
if(pushV.size()&& popV.size())
{
while(i < pushV.size())
{
while((pushs.empty())||(j<popV.size()) && (pushs.top() != popV[j]) )
{
pushs.push(pushV[i]);
i++;
}
while((!pushs.empty())&& (j<popV.size())&& (pushs.top() == popV[j]))
{
pushs.pop();
j++;
}
}
if(pushs.empty())
isoder = true;
}
return isoder;
}
};
尽管这道题还有其他最为简单的办法,但是这里,我们不讲究任何技巧,介绍一种最为朴素的思想:
如果给出的序列是一种入栈数组的出栈序列,那么我们将这个数组数组入栈,并且按照某种规则出栈,那么最终会得到一个和给出序列一样的序列,并且这个栈最终会变成空栈!而我们判断这个序列是否是给出数组的一种出栈可能,就是看我们模拟出来的这个栈是否最终会变成一个空栈。
下面,我们探讨,上述提到的所谓出栈规则究竟是什么?
如果要验证所给的序列确实是入栈数组的出栈序列,我们应该做的就是:尽量对入栈序列按照给定的出栈方式出栈,如果最后全部元素出栈,即栈空,则表明所给出栈序列是正确的。下面我们具体的举例说明:
假设提供的是入栈序列是1、2、3、4、5;提供的出栈序列是 4 3 5 1 2;如何验证这个序列是否正确呢?
核心思路即上述所说:使得入栈序列的出栈方式尽量向所给出栈序列靠拢。下面我们来描述一下完整的思路:
假设提供的入栈顺序是:、、、、 push() -> stack.top() = ≠,继续push push() -> stack.top() = ≠,继续push push() -> stack.top() = ≠,继续push push() -> stack.top() = =,pop(),出栈索引+,此时指向了3 stack.top = = ,pop(),出栈索引+,此时指向了5。 stack.top = ≠,继续push push() ->stack.top = = ,pop(),出栈索引+,此时指向了2 stack.top = = ,pop(),出栈索引+,此时指向了1。 stack.top = = ,pop(),出栈索引+,此时指向了空。 **此时stack为空!!!,因此4、、、、1是1、、、、5的一个出栈序列**
上文已经给出类似于判决思路:模拟序列的入栈出栈过程,使其出栈向所给序列靠拢,若最后所有元素成功出栈,即栈空,表明所给序列是正确的。
下面针对上述代码,我们说明STL中栈stack的一一些函数。
push(x),将元素x入栈 pop(),将栈顶元素出栈,但是并不返回栈顶元素(返回类型为void) top(),返回栈顶元素,但是不删除栈顶元素(不执行pop功能),**若栈为空,执行top()返回-** empty(),判断栈是否为空,**为空返回1,不空返回0**
其他函数以后遇到再说:
此题的延伸题目:给出一个入栈序列,求所有的出栈序列?(思考怎么做)
给出一个长度为n的序列,其所有的出栈可能数为:卡塔兰数

牛客网剑指offer第21题——判断出栈序列是否是入栈序列的更多相关文章
- 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面
题目来源:剑指offer 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变 ...
- 牛客网剑指offer第19题——顺时针打印矩阵
这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...
- 牛客网剑指offer第34题——找到第一个只出现一次的字符
题目如下: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 先上代码: class ...
- 数据流中的中位数 牛客网 剑指Offer
数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...
- 数字在排序数组中出现的次数 牛客网 剑指Offer
数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...
- 矩形覆盖 牛客网 剑指Offer
矩形覆盖 牛客网 剑指Offer 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution: ...
- 数组中只出现过一次的数字 牛客网 剑指Offer
数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...
- 数组中出现次数超过一半的数字 牛客网 剑指Offer
数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...
- 数值的整数次方 牛客网 剑指Offer
数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...
随机推荐
- C++中free()与delete的区别
1.new/delete是C++的操作符,而malloc/free是C中的函数. 2.new做两件事,一是分配内存,二是调用类的构造函数:同样,delete会调用类的析构函数和释放内存.而malloc ...
- chromosome interaction mapping|cis- and trans-regulation|de novo|SRS|LRS|Haplotype blocks|linkage disequilibrium
Dissecting evolution and disease using comparative vertebrate genomics-The sequencing revolution s ...
- Android 5.0 5.1 webview 闪退问题
自定义webview /** * 处理Android 5.0 5.1 webview 闪退 */ class MyWebView : WebView { companion object{ priva ...
- VirtualBox虚拟机安装
目录 安装前准备 1.开始安装,安装很简单,直接上图 2.设置全局路径,这里主要是方便以后创建虚拟机的时候不用每次都去选择存放位置,默认是存放到C盘 安装前准备 系统:Windows 10 专业版 软 ...
- 2019-2020-1 20199324《Linux内核原理与分析》第八周作业
第七章 可执行程序工作原理 一.ELF目标文件格式 目标文件:ABI,应用程序二进制接口,是编译器生成的文件. ELF:可执行的和可链接的格式,是一个目标文件格式的标准.三种类型是: 可重定位文件:L ...
- 在windows系统下安装使用msf
前沿 msf基本是我在kali里最经使用的工具了 因为今天碰到一些关于VmWare的事情没有解决 windows在前一段时间更新,要求我卸载vmware虚拟机,否则就无法更新. 卸载之后再装回来就无法 ...
- VLC查看日志的方法
最近使用VLC去播放rtsp网络串流总是失败,显示要查看日志,查看的方法: 进入VLC的GUI,点击视图,添加界面,添加调试窗口: 添加调试窗口,会弹出界面: 上面会有报错的提示. 大佬如果有其他的办 ...
- 概率DP——BZOJ4008 [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 ...
- ccpc20190823
04 http://acm.hdu.edu.cn/showproblem.php?pid=6705 分析:先把每条边以 形式放进堆,堆按路径权值从小到大排序,然后每次取出堆顶,用v的出边扩展 新的路径 ...
- Redis实现高并发分布式锁
分布式锁场景在分布式环境下多个操作需要以原子的方式执行首先启一个springboot项目,再引入redis依赖包: <!-- https://mvnrepository.com/artifa . ...