写一个栈,实现出栈、入栈、求最小值,时间复杂度为O(1)
#-*-coding:utf-8-*-
'''
需求:写一个栈,实现出栈、入栈、求最小值,时间复杂度为O(1)
思路:通过两个栈实现,一个栈stack,一个辅助栈min_stack,记录stack中的最小值
栈stack,元素正常push和pop操作
栈min_stack:
入栈(push):
第一次push,元素正常放入栈中;
之后每一次push的元素data(即栈顶元素 min_stack[top])都和栈顶元素的前一个元素(即 min_stack[top-1])进行比较
data < min_stack[top-1],则将data置为min_stack的栈顶
data >= min_stack[top-1],则将min_stack[top-1]置为min_stack的栈顶
出栈(pop):
辅助栈min_stack 在stack有pop的时候一并pop操作
如此,min_stack栈中的栈顶位置始终保存这stack栈中的最小值
''' class Stack(object):
def __init__(self, size=8):
self.size = size
self.stack = []
self.min_stack = []
self.top = -1 def set_size(self, size):
if self.top >= size:
raise Exception("StackWillOverFlow")
self.size = size def isFull(self):
return True if self.top == self.size - 1 else False def isNull(self):
return True if self.top == -1 else False def push(self, data):
if self.isFull():
raise Exception("Stack over flow")
return
self.top += 1
self.stack.append(data)
#将栈的第一个元素赋给min_stack
if self.top == 0:
self.min_stack.append(data)
#当stack push第二个元素后开始比较,使得 min_stack[top] 始终为当前栈中的最小元素
if self.top > 0:
if data < self.min_stack[self.top-1]:
self.min_stack.append(data)
else:
self.min_stack.append(self.min_stack[self.top-1]) def pop(self):
if self.isNull():
raise Exception("Stack is Empty")
return
self.top -= 1
#stack pop的时候min_stack一并pop
self.min_stack.pop()
return self.stack.pop() def get_top(self):
if self.isNull():
raise Exception("Stack is Empty")
return
return self.stack[self.top] def show(self):
print self.stack # min_stack栈的栈顶元素记录着当前栈的最小值
def get_min(self):
if self.isNull():
raise Exception("Stack is Empty")
return
return self.min_stack[self.top] #test
def Test():
a = Stack(10)
a.push(11)
a.push(12)
a.push(13)
a.push(10)
a.push(9)
a.push(8)
a.push(15)
a.push(16) a.show()
print a.get_min() a.pop()
a.show()
print a.get_min() a.pop()
a.show()
print a.get_min() a.pop()
a.show()
print a.get_min() a.pop()
a.show()
print a.get_min() a.push(20)
a.show()
print a.get_min() a.push(1)
a.show()
print a.get_min() if __name__ == '__main__':
Test()
写一个栈,实现出栈、入栈、求最小值,时间复杂度为O(1)的更多相关文章
- php栈的定义及入栈出栈的实现 算法
转自:php栈的定义及入栈出栈的实现 栈是线性表的一种,他的特点是后入先出,可以这么理解,栈就像一个存东西的盒子,先放进去的在最底层,后放进去的在上层,因为上层的东西把底层的东西压住了,下层的想要出去 ...
- c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)
/* c++描述将2进制数转化成10进制数 问题,1.初始化栈后,用new,不知道delete是否要再写一个函数释放内存, 还是在哪里可以加上delete 2.如果栈满了,我要分配多点空间,我想的办法 ...
- C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)
/**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...
- Java定义栈结构,实现入栈、出栈操作
package com.example.demo; import java.util.ArrayList; public class Stack { ArrayList<Object> l ...
- 牛客网剑指offer第21题——判断出栈序列是否是入栈序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- python栈的实现(入栈,出栈)
#coding=utf-8 class Stack(): def __init__(st,size):#栈的初始化 st.stack=[]; st.size=size; st.top=-1 def p ...
- C语言 栈的初始化,入栈,出栈,判断栈是否为空,清空栈等函数
#include <stdio.h>#include <stdlib.h> typedef struct Node{ int data ; struct Node * pNex ...
- 【C语言】写一个函数,并调用该函数求两个整数的最大公约数和最小公倍数
程序分析: 在数学中,两个数的最小公倍数=两个数的乘积/两数的最大公约数. 求两个数的最大公约数,运用辗转相除法:已知两个整数M和N,假定M>N,则求M%N. 如果余数为0,则N即为所求:如果余 ...
- 一个栈的入栈序列为ABCDEF,则不可能的出栈序列是
技术之瞳 阿里巴巴技术笔试心得习题2.65: 一个栈的入栈序列为ABCDEF,则不可能的出栈序列是(D) A.DEFCBA B.DCEFBA C.FEDCBA D.FECDBA E.ABCDEF ...
- Python 根据入栈顺利判定出栈顺序
1.读取入栈,出栈数据: 2.把数据分别转化成整数列表: 3.新建栈列表,用入栈数据进行压栈:如果栈列表不为空,并且栈顶层数据为出栈的元素:删除栈列表的顶层数据: 4.如果栈列表不为空,说明栈列表里面 ...
随机推荐
- Eclipse中JBoss插件配置
JBoss 服务器集成到Eclispe(考虑Eclipse版本Version: Indigo Service Release 2) http://www.cnblogs.com/sunddenly/p ...
- Selenium-Css Selector使用方法
什么是Css Selector? Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder 或 ...
- R绘图 第六篇:绘制线图(ggplot2)
线图是由折线构成的图形,线图是把散点从左向右用直线连接起来而构成的图形,在以时间序列为x轴的线图中,可以看到数据增长的趋势. geom_line(mapping = NULL, data = NULL ...
- ElasticSearch查询 第一篇:搜索API
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- 12、利用docker快速搭建Wordpress网站
一.准备工作 结构图: 用户访问页面,Nginx将请求进行转发,如果请求的是php页面,则通过FastCGI转发给后端php进行处理:如果非php页面,则直接返回静态页面. 关键点: mysql.ph ...
- Windows Defender还原误删文件
Win 10 新版本的Windows Defender隔离/删除的文件没有还原的选项,导致被误删的文件无法在威胁记录中恢复.经过尝试发现可以通过修改注册表添加 “还原” 选项 打开注册表,找到 HKE ...
- JMeter采用NON GUI模式时如何记录并查看错误
在GUI模式下执行JMeter测试时,我们可以通过添加View Results Tree组件来查看JMeter请求的各类详情.那如果在正式测试场景中,当我们采用NON GUI模式时,遇到了断言或其他错 ...
- 手机Gmail上用Exchange协议配置收发QQ邮箱
1.开启Exchange服务 2.生成授权码(登录密码) 3."服务器"填入ex.qq.com
- CocoStuff—基于Deeplab训练数据的标定工具【二、用已提供的标注数据跑通项目】
一.说明 本文为系列博客第二篇,主要讲述笔者在使用该团队提供已经标注好的COCO数据集进行训练的过程. 由于在windows中编译Caffe和Deeplab特别的麻烦,笔者并没有去探索,后续可能会去尝 ...
- python 游戏(记忆拼图Memory_Puzzle)
1. 游戏功能和流程图 实现功能:翻开两个一样的牌子就显示,全部翻开游戏结束,设置5种图形,7种颜色,游戏开始提示随机8个牌子 游戏流程图 2. 游戏配置 配置游戏目录 配置游戏(game_conf. ...