包含最小元素的栈

题目:设计包含min函数的栈。

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。

要求函数min、push以及pop的时间复杂度都是O(1)。

文件分布:

头文件和main文件

头文件:代码

#include <stack>
#include <assert.h>

using namespace std;

template <typename T>
class stackWithMin{
	private :
		stack<T> m_data;
		stack<T> m_min;

	public:
		stackWithMin(){}
	    virtual	~stackWithMin(){}

		const T& top() ;
		T& top() const;

		void push(const T& value);
		void pop();

		const T& min() const;

		bool empty() const ;
		int size() const;
};

//入栈
template <typename T> void stackWithMin<T>::push(const T& value){
	//新元素入栈
	m_data.push(value);

	//最小值入栈
	if(m_min.size() == 0 || value < m_min.top() )
		m_min.push(value);
	else
		m_min.push(m_min.top());
}

//出栈
template<typename T> void stackWithMin<T>::pop(){
	assert(m_data.size() >0 && m_min.size() > 0);

	m_data.pop();
	m_min.pop();
}

//获得最小元素
template<typename T> const T& stackWithMin<T>::min() const{
	assert(m_data.size() > 0 && m_min.size() >0);

	return m_min.top();
}

//获得栈顶元素 返回普通值
template<typename T> T& stackWithMin<T>::top() const{
	return m_data;
}

//获得栈顶元素 返回常引用
template<typename T> const T& stackWithMin<T>::top() {
	return m_data;
}

//大小
template<typename T> int stackWithMin<T>::size() const {
	return m_data.size();
}

//是否为空
 template<typename T> bool stackWithMin<T>::empty() const{
	return m_data.empty();
 }

main文件:代码

#include <iostream>
#include <stack>
#include <assert.h>
#include "minStack.h"

using namespace std;

int main()
{
	stackWithMin<int> data;

	data.push(3);
	  cout<< data.min()<<" ";
	data.push(2);
    	cout<< data.min()<<" ";
	data.push(3);
	  cout<< data.min()<<" ";
	data.push(2);
	cout<< data.min()<<" ";
    return 0;
}

运行结果:

包含最小元素的栈,布布扣,bubuko.com

时间: 2024-10-11 12:26:10

包含最小元素的栈的相关文章

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈

小结: 1. 常数时间内检索到最小元素 最小栈 - 力扣(LeetCode)https://leetcode-cn.com/problems/min-stack/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. getMin() -- 检索栈中的最小元素. 示例: MinStack minStack = new MinStack(); minSt

C语言强化(二)设计可以求最小元素的栈

上一篇详解了二叉树转双向链表,此篇作为[C语言强化]系列第二篇,来聊聊有关栈的一道题, 通过这道题,你可以掌握 如何使用栈"先进后出"的特性 如何巧妙地借助辅助栈 如何在结构体中定义可共享的静态成员变量 题目 看似很简单的求最小值函数,思路有很多很多.笔者首先想到每次push入栈都进行一次排序,使这个栈的栈顶永远是最小元素,然后就发现这是一个很蠢很蠢的想法,第一这样做会改变了栈的结构,第二不满足题目对时间复杂度的要求. 愚蠢归愚蠢,还是有点用的.既然不能改变原来栈的结构,那为何不弄俩栈

[算法]求栈中最小元素

如何用O(1)的时间复杂度求栈中最小元素 解题思路: 我们经常会采用空间换取时间提高时间复杂度.我们可以使用两个栈结构,一个栈用来存储数据,另一个栈用来存储栈中的最小元素.思路如下:如果当前入栈的元素比原来栈中的最小值还小,则把这个值压入保存最小元素的栈中:在出栈时,如果当前入栈的元素恰好为当前栈中的最小值,保存最小值的栈顶元素也出栈,使得当前最小值变为其入栈之前的那个最小值. 实现代码如下: package 求栈中最小元素; /** * 用链表方式实现栈 * @author dream * *

剑指offer系列——20.包含min函数的栈

Q:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). T: 看到这个问题, 我们最开始可能会想, 添加一个成员变量用于保存最小元素, 每次压栈时如果压栈元素比当前最小元素更小, 就更新最小元素. 但是这样会有一个问题, 如果最小元素被弹出了呢, 如何获得下一个最小元素呢? 分析到这里可以发现, 仅仅添加一个成员变量存放最小元素是不够的, 我们需要在最小元素弹出后还能得到次小元素, 次小的弹出后, 还要能得到次次小的. 因此, 用另一个栈来保存

实现栈最小元素的min函数

1 #include<iostream> 2 #include<stack> 3 using namespace std; 4 class min_stack 5 { 6 public: 7 void push(int); 8 void pop(); 9 int min(); 10 int size() 11 { 12 return data.size(); 13 } 14 private: 15 stack<int> data; 16 stack<int>

O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素(转)

题目要求:定义栈的数据结构,添加min().max()函数(动态获取当前状态栈中的最小元素.最大元素),要求push().pop().min().max()的时间复杂度都是O(1). 思路解析:根据栈的后进先出特性,增加辅助栈,来存储当前状态下数据栈中的最小.最大元素. 原文:http://blog.csdn.net/happy309best/article/details/47725935

构造一个可以在固定时间内返回最小元素值的栈

我一开始没想太多,觉得把标准库里现有的数据结构拼一下,完全就可以了,这是我的代码: class MinStack { private: multiset<int> sortedElems; list<int> stack; public: void push(int x) { sortedElems.insert(x); stack.push_back(x); } void pop() { if (stack.empty()){ return; } sortedElems.eras

笔试算法题(05):转换BST为双向链表 &amp; 查找栈中的最小元素

出题:把二元查找树转变成排序的双向链表.输入一棵二元查找树,要求将该二元查找树按照中序转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整指针的指向: 分析: 递归的思路,当前节点需要进行的处理,并使用递归调用和返回值将子问题链接起来: 首先明白二元查找树的特性,变成有序双向链表后当前根节点的左节点为其原来左子树的最右节点,右节点为其原来右子树的最左节点:因此策略就是针对当前根节点索引的子树,首先判断其为上层节点的右子树还是左子树,从而决定返回最右还是最右节点:然后再递归处理当前根节点的

一、实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

请指教交流! 1 package com.it.hxs.c01; 2 3 import java.util.Stack; 4 5 /* 6 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 7 */ 8 public class GetMinStack { 9 10 public static void main(String args[]) { 11 GetMinStack demoStack = new GetMinStack(); 12 demoStack.pus