[剑指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). 示例 ...
随机推荐
- windows电脑配置耳机只有一个耳朵响
也许你在工作,需要一个耳朵听同事的声音,一个耳朵听电脑的音乐,但是又不想另一个耳机头泄露声音,这样就有了想配置只有左/右单个耳机头会响的操作. 那么我们就开始配置吧,我这里以win10为例: 右击桌面 ...
- ubuntu 下jrtplib编译
我本来想用最新的 jrtplib-3.9.1和jthread-1.3.1,可是最新的那两个版本中都是用cmake进行配置的,我搞了好久,查了好多资料也没有解决交叉编译的问题,无奈,只能选用比较老的两个 ...
- Problem 2
Problem 2 # Problem_2.py """ Each new term in the Fibonacci sequence is generated by ...
- Spring知识梳理
Spring框架介绍 Spring是一个贯穿各层为javaEE提供一站式解决方案的框架,Spring中主要有容器模块,AOP模块,ORM和DAO模块,Web模块等等,具体有以下功能特征. IOC(或者 ...
- [SharePoint][SharePoint Designer 入门经典]Chapter11 工作流基础
1.SPS中可以创建的工作流的种类 2.SPD工作流基础 3.创建列表\库工作流 4.创建可重用的工作流 5.利用基于站点的工作流 6.SPD 工作流的限制和注意事项
- hdu 4717 The Moving Points(三分)
http://acm.hdu.edu.cn/showproblem.php?pid=4717 大致题意:给出每一个点的坐标以及每一个点移动的速度和方向. 问在那一时刻点集中最远的距离在全部时刻的最远距 ...
- jQuery动画animate()的使用
自己定义动画效果: 使用方法:animate(js对象,运行时间.回调函数): js对象:{ }描写叙述动画运行之后元素的样式 运行时间:毫秒数 回调函数:动画运行结束后要运行的函数 html代码: ...
- Android自己定义View之组合控件 ---- LED数字时钟
先上图 LEDView效果如图所看到的. 之前看到一篇博客使用两个TextView实现了该效果.于是我想用自己定义控件的方式实现一个LEDView.使用时就可以直接使用该控件. 採用组合控件的方式,将 ...
- phpStorm中ftp的配置与使用,支持配置多个
小结:很方便,支持ftp功能和比较. 扩展,可以查看远程文件和日期 配置多个ftp
- 【BZOJ 2038】小Z的袜子
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2038 [算法] 莫队算法 [代码] #include<bits/stdc++. ...