[剑指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). 示例 ...
随机推荐
- Hibernate 的核心配置文件
核心配置文件 <!-- SessionFactory,相当于之前学习连接池配置 --> <session-factory> <!-- 1 基本4项 --> < ...
- 域名系统(DNS)
DNS (domain name server/system) 1.基本信息 网络中数据通信依赖ip地址 测试:手动将dns服务地址改为空值,通过ip和域名分别测试网络的联通性 FQDN 完全域名(完 ...
- 1.1 Eclipse的安装
下载地址:http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/indigosr1 2.java jdk 的 ...
- js 只能输入英文和数字,且首位必须是字母,字母总数不能超过3个,总长度不能超过20!
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- lim的日常生活
- 【C/C++多线程编程之十】pthread线程私有数据
多线程编程之线程私有数据 Pthread是 POSIX threads 的简称.是POSIX的线程标准. 线程同步从相互排斥量[C/C++多线程编程之六]pthread相互排 ...
- SDUT OJ 1124 飞越原野 (三维BFS练习)
飞跃原野 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit5000ms Memory Limit 65536K ...
- 2014.08.04,读书,读书笔记-《Matlab概率与数理统计分析》-第1章 MATLAB的数据基础
第1章 MATLAB数据基础 虽然一直间或使用MATLAB,但从来没有系统的学习过,现在开始也不晚.先对几个重点或者平时忽略的要点做下笔记. %后的所有文字为注释,多条命令可以放在一行,但要用逗号或分 ...
- BZOJ 2751 容易题(easy) 快速幂+快速乘
2751: [HAOI2012]容易题(easy) Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i] ...
- zzulioj--1858--单词翻转(模拟)
1858: 单词翻转 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 88 Solved: 35 SubmitStatusWeb Board Desc ...