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.栈的压入、弹出序列 (队列 栈)的更多相关文章

  1. 剑指offer - 栈的压入弹出序列 - JavaScript

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 ...

  2. 【剑指offer】栈的压入弹出序列,C++实现(举例)

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为第一个序列的出栈序列.注意 ...

  3. 剑指Offer20 栈的压入弹出序列是否正确

    /************************************************************************* > File Name: 20_IsPopO ...

  4. 剑指offer-面试题22.栈的压入,弹出序列

    题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第 二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等. 例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1 是该压栈 ...

  5. 剑指offer-栈的压入弹出序列21

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  6. 剑指offer-面试题31-栈的压入弹出序列-栈

    #include<iostream> #include<string.h> #include<algorithm> #include<cmath> #i ...

  7. redis list 查询、下标查询、删除、裁剪、压入弹出、队列实现

    查询  lrange list 0 1 // 注意0和1之间是空格:这个命令和pop命令不一样,不会删除里面的值lrange list 0 -1 // 所有的 下标查询 lpush person zs ...

  8. 剑指 Offer 30. 包含min函数的栈 + 双栈实现求解栈中的最小值

    剑指 Offer 30. 包含min函数的栈 Offer_30 题目描述: 题解分析: 题目其实考察的是栈的知识,本题的目的是使用两个栈来求解最小值. 第二个栈主要用来维护第一个栈中的最小值,所以它里 ...

  9. 力扣 - 剑指 Offer 30. 包含min函数的栈

    题目 剑指 Offer 30. 包含min函数的栈 思路1 使用一个辅助栈min_stack,用来维护栈的最小的元素 每次添加元素入栈时候,data_stack和min_stack都要同时维护 dat ...

  10. 剑指 Offer 30. 包含min函数的栈

    剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例 ...

随机推荐

  1. Hibernate 的核心配置文件

    核心配置文件 <!-- SessionFactory,相当于之前学习连接池配置 --> <session-factory> <!-- 1 基本4项 --> < ...

  2. 域名系统(DNS)

    DNS (domain name server/system) 1.基本信息 网络中数据通信依赖ip地址 测试:手动将dns服务地址改为空值,通过ip和域名分别测试网络的联通性 FQDN 完全域名(完 ...

  3. 1.1 Eclipse的安装

    下载地址:http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/indigosr1 2.java jdk 的 ...

  4. js 只能输入英文和数字,且首位必须是字母,字母总数不能超过3个,总长度不能超过20!

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. lim的日常生活

     

  6. 【C/C++多线程编程之十】pthread线程私有数据

    多线程编程之线程私有数据      Pthread是 POSIX threads 的简称.是POSIX的线程标准.         线程同步从相互排斥量[C/C++多线程编程之六]pthread相互排 ...

  7. SDUT OJ 1124 飞越原野 (三维BFS练习)

    飞跃原野 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit5000ms Memory Limit 65536K ...

  8. 2014.08.04,读书,读书笔记-《Matlab概率与数理统计分析》-第1章 MATLAB的数据基础

    第1章 MATLAB数据基础 虽然一直间或使用MATLAB,但从来没有系统的学习过,现在开始也不晚.先对几个重点或者平时忽略的要点做下笔记. %后的所有文字为注释,多条命令可以放在一行,但要用逗号或分 ...

  9. BZOJ 2751 容易题(easy) 快速幂+快速乘

    2751: [HAOI2012]容易题(easy) Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i] ...

  10. zzulioj--1858--单词翻转(模拟)

    1858: 单词翻转 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 88  Solved: 35 SubmitStatusWeb Board Desc ...