[剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)
c++里面stack,queue的pop都是没有返回值的,
vector的pop_back()也没有返回值。
思路:
队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2.pop()
但是当s1,s2都有元素时,应该优先s2.pop(),否则会报错,最好是各种模拟s1,s2的数据情况
不过说是用两个栈实现,但这里其实也是两个List
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack1=[]
self.stack2=[]
def push(self, node):
# write code here
self.stack1.append(node)
def pop(self):
# return xx
# 思路就是在stack2里逆序放置stack1的元素,然后stack2.pop()
# 但是当s1,s2都有元素时,应该优先s2.pop()
if self.stack2==[]:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
return self.stack2.pop()
- 两个栈在函数里,注意自己要事先定义,初始化
- 一定是 self.stack,直接用stack会报错,未定义
思路:
借助一个辅助栈,始终存放数据栈中的最小值(辅助栈元素个数与数据栈相同,如数据栈为3,2,4,1,则辅助栈为3,2,2,1),这样只要输出当前辅助栈顶的元素就能保证时间复杂度为O(1)。
那么同时,push的时候也要考虑辅助站的输入;
每当数据站pop一下,无论该数据是否为最小值,辅助栈也要pop一个数据。
当第一次push时,辅助栈为None,直接push当前node,如果进行大小比较的话,辅助栈会输入none而报错。
同时,注意self,与stack,assist两个栈的初始化。
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack=[]
self.assist=[]
def push(self, node):
# write code here
minimum=self.min()
if(node<minimum or minimum==None):
self.assist.append(node) #python的list只有append操作,c++的vector是push_back
else:
self.assist.append(minimum)
self.stack.append(node) def pop(self):
# write code here
if self.stack: #鲁棒性考虑
self.assist.pop() #两个栈都进行弹出
return self.stack.pop() #除push都是返回型操作 def top(self):
# write code here
if self.stack:
return self.stack[-1] def min(self):
# write code here
if self.assist:
return self.assist[-1]
思路:
建一个辅助栈遍历Push并将其中元素依次装入,每入栈一个元素,检查辅助栈栈顶元素和pop是否相同,若相同则弹出栈顶元素并将pop里当前元素后移,不相等就一直进行入栈。
最后遍历完成,若辅助栈为空说明为true。
注意:一定要用while而不能用If,这里需要循环判断
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
//建一个辅助栈遍历Push并将其中元素依次装入,每入栈一个元素,检查辅助栈栈顶元素和pop是否
//相同,若相同则弹出栈顶元素并将pop里当前元素后移,不相等就一直进行入栈
//最后遍历完成,若辅助栈为空说明为true
if(pushV.size() == )
return false;
vector<int> stack;
int j = ;
for (int i = ; i<pushV.size(); i++){
stack.push_back(pushV[i]);
//1.j < popV.size() 循环中一定要判断j是否超出索引
//在弹出所有元素后(1,2,3,4,5)与(4,5,3,2,1) j++使得j=5,这时候再进行最后一次while判断,但popV[j]就会索引错误
//2.python可以list[-1]返回最后一个元素,但vector是vec.back()
while (j < popV.size()&& stack.back() == popV[j]){
stack.pop_back();
j++;
}
}
return stack.empty();
}
};
[剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)的更多相关文章
- 剑指offer - 栈的压入弹出序列 - JavaScript
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...
- 【剑指offer】栈的压入弹出序列,C++实现(举例)
原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...
- 剑指Offer20 栈的压入弹出序列是否正确
/************************************************************************* > File Name: 20_IsPopO ...
- 剑指offer-面试题22.栈的压入,弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第 二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等. 例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1 是该压栈 ...
- 剑指offer-栈的压入弹出序列21
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- 剑指offer-面试题31-栈的压入弹出序列-栈
#include<iostream> #include<string.h> #include<algorithm> #include<cmath> #i ...
- redis list 查询、下标查询、删除、裁剪、压入弹出、队列实现
查询 lrange list 0 1 // 注意0和1之间是空格:这个命令和pop命令不一样,不会删除里面的值lrange list 0 -1 // 所有的 下标查询 lpush person zs ...
- 剑指 Offer 30. 包含min函数的栈 + 双栈实现求解栈中的最小值
剑指 Offer 30. 包含min函数的栈 Offer_30 题目描述: 题解分析: 题目其实考察的是栈的知识,本题的目的是使用两个栈来求解最小值. 第二个栈主要用来维护第一个栈中的最小值,所以它里 ...
- 力扣 - 剑指 Offer 30. 包含min函数的栈
题目 剑指 Offer 30. 包含min函数的栈 思路1 使用一个辅助栈min_stack,用来维护栈的最小的元素 每次添加元素入栈时候,data_stack和min_stack都要同时维护 dat ...
- 剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例 ...
随机推荐
- PuTTY_0.67.0.0工具链接linux
1.虚拟机设置 在网络适配器中选中桥接模式,勾选复制物理网络链接状态(p)选项.点击确认. 2.开启虚拟机,检查是否安装有ssh服务器 a.查看是否启动ssh服务器 ps -a | grep ssh ...
- Hibernate的事务机制
http://www.cnblogs.com/jerryxing/archive/2012/04/24/2468999.html http://www.cnblogs.com/xiaofeilee/p ...
- android Build系统
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/ android Build系统 超链接
- Profile 动态切换环境
一.多 Profile 文件我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml默认使用 application.properties 的 ...
- JavaScript中的XMLDOM对象
测试: demo.xml中的内容: js文件内容: window.onload=function(){ //var v=returnXMLDOM(); //v.loadXML('<root> ...
- 分享一些 Java 后端的个人干货
学习 Java 也有了不少时间,入 Java 后台的坑也有了一段时日.这段时间里,听过许多前辈的经验与分享,也看过许多大佬的文章和作品.找了个时间整理和总结了一下我个人到目前为止一路以来的听到看到或者 ...
- 最短路&查分约束
[HDU] 1548 A strange lift 根蒂根基最短路(或bfs)★ 2544 最短路 根蒂根基最短路★ 3790 最短路径题目 根蒂根基最短路★ 2066 一小我的观光 根蒂根基最短路( ...
- 洛谷—— P2668 斗地主
https://www.luogu.org/problem/show?pid=2668 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...
- oracle 解除锁表sql
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b ...
- HDU 4351
求某区间各个子集的和的根的最大的五个数. 子集根其实就是这个数模9后的余数,注意的是要区分0和9,两者的余数都是0.. 记录前i个数的和的根,设为sum数组,然后处理两个数组 lft[i][j]表示从 ...