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. grep的各种用法

    1. 在文件中查找模式(单词) 在/etc/passwd文件中查找单词 root [root@localhost opt]# grep root /etc/passwdroot:x:0:0:root: ...

  2. assound.conf

    pcm.!dmix {type dmixipc_key 5678293ipc_key_add_uid yesslave {pcm "hw:0,0"period_time 0peri ...

  3. JavaScript(DOM编程补充一)

    HTML属性的直接调用: 还可以通过getAttribute方法获取属性的值: setAttribute方法: removeAttribute ---------------------------- ...

  4. jQuery练习总结(一)

    第一个jQuery程序: 注意:使用jQuery时候定义单击事件使用的方法是click(function(){处理单击事件产生时所要执行的代码}) , 而JavaScript定义的单击事件则是 xx. ...

  5. hdu 2491 贪心

    #include<stdio.h> #include<stdlib.h> #define N 110000 struct node { int u,v,len,time; }m ...

  6. 洛谷 P1124 文件压缩

    P1124 文件压缩 题目背景 提高文件的压缩率一直是人们追求的目标.近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本身并不压缩文件,但是经这种算法调整后的文件在大多数情况下都能获得比 ...

  7. TeamTalk Android代码分析(业务流程篇)---消息发送和接收的整体逻辑说明

    第一次纪录东西,也没有特别的顺序,想到哪里就随手画了一下,后续会继续整理- 6.2消息页面动作流程 6.2.1 消息页面初始化的总体思路 1.页面数据的填充更新直接由页面主线程从本地数据库请求 2.数 ...

  8. NOIp2018之前打模板出现的问题汇总

    灵感来源是因为调试了一下午dij,就想把错误记下来 dij:结构体里的重载运算符不会写      结构体声明后要加引号     用于排序的结构体按照边长度排序 匈牙利:在dfs中的if语句中,要继续搜 ...

  9. 如何在maven项目中使用spring

    今天开始在maven项目下加入spring. 边学习边截图. 在这个过程中我新建了一个hellospring的项目.于是乎从这个项目出发开始研究如何在maven项目中使用spring.鉴于网上的学习资 ...

  10. BZOJ 4522 Pollard-rho+exgcd

    思路: N=P*Q 求出来P和Q 模拟就好- //By SiriusRen #include <cstdio> #include <algorithm> using names ...