写一个栈,实现出栈、入栈、求最小值,时间复杂度为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.如果栈列表不为空,说明栈列表里面 ...
随机推荐
- python 穷举法 算24点(史上最简短代码)
本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...
- 洛咕 P3700 [CQOI2017]小Q的表格
洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...
- windows超级实用快键键
1 电脑锁屏Win + L 有些时候,需要暂时离开座位去处理其他事,可是电脑还有数据再跑. 关掉的话,数据就白跑了,不关的话,又不想让别人看到我电脑的资料. 那么就按住windows键后,再按L键. ...
- 【ORACLE】Win2008R2修改oracle数据库实例名
需求说明:要求将windows平台的数据库实例名由orcl改为haha 参考: https://www.cnblogs.com/junnor/archive/2013/03/05/2945245.ht ...
- 前端项目模块化的实践2:使用 Webpack 打包基础设施代码
以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...
- jquery自动获取项目url路径
//很多时候我们需要使用当前项目路径,但是如果把项目路径写死,会带来很多不便,此时就需要自动获取项目路径.//我们可以根据jquery来进行自动获取项目路径,获取方法如下function getRoo ...
- Redis源码阅读(二)高可用设计——复制
Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致 ...
- 在Linux系统中安装caffe
学习深度学习已经很久了,但一直没有自己动手安装过caffe,因为工作需要,需要在linux系统中安装caffe,因此,在这里对安装过程进行记录. caffe配置起来比tensorflow更麻烦一些,我 ...
- PAT甲题题解-1025. PAT Ranking (25)-排序
排序,求整体的排名和局部的排名整体排序,for循环一遍同时存储整体目前的排名和所在局部的排名即可 #include <iostream> #include <cstdio> # ...
- LeetCode 141. Linked List Cycle环形链表 (C++)
题目: Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked ...