《剑指offer》第三十题(包含min函数的栈)
// 面试题30:包含min函数的栈
// 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min
// 函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 #include <iostream>
#include <stack>
#include <assert.h> //////////////////////////定义一个模板类///////////////////////////
template <typename T> class StackWithMin
{
public:
StackWithMin() {}
virtual ~StackWithMin() {}//虚析构函数 //T& top();
const T& top() const; void push(const T& value);
void pop(); const T& min() const; bool empty() const;
size_t size() const; private:
std::stack<T> m_data; // 数据栈,存放栈的所有元素
std::stack<T> m_min; // 辅助栈,存放栈的最小元素
}; template <typename T> void StackWithMin<T>::push(const T& value)//模板类的构造函数,好好看看这一行怎么写的
{
// 把新元素添加到辅助栈
m_data.push(value); // 当新元素比之前的最小元素小时,把新元素插入辅助栈里;
// 否则把之前的最小元素重复插入辅助栈里
if (m_min.size() == || 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() > && m_min.size() > );//检测括号中的话是真的不 m_data.pop();
m_min.pop();
} template <typename T> const T& StackWithMin<T>::min() const//返回辅助栈的顶点
{
assert(m_data.size() > && m_min.size() > ); return m_min.top();
} //template <typename T> T& StackWithMin<T>::top()
//{
// return m_data.top();
//} template <typename T> const T& StackWithMin<T>::top() const//返回数据栈的顶点
{
return m_data.top();
} template <typename T> bool StackWithMin<T>::empty() const//检测数据栈空否
{
return m_data.empty();
} template <typename T> size_t StackWithMin<T>::size() const//返回数据栈size
{
return m_data.size();
}
//////////////////////////测试代码///////////////////////////
void Test(const char* testName, const StackWithMin<int>& stack, int expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); if (stack.min() == expected)
printf("Passed.\n");
else
printf("Failed.\n");
} int main(int argc, char* argv[])
{
StackWithMin<int> stack; stack.push();
Test("Test1", stack, ); stack.push();
Test("Test2", stack, ); stack.push();
Test("Test3", stack, ); stack.push();
Test("Test4", stack, ); stack.pop();
Test("Test5", stack, ); stack.pop();
Test("Test6", stack, ); stack.pop();
Test("Test7", stack, ); stack.push();
Test("Test8", stack, ); system("pause");
return ;
}
《剑指offer》第三十题(包含min函数的栈)的更多相关文章
- 剑指Offer面试题:19.包含Min函数的栈
一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...
- 剑指offer——面试题30:包含min函数的栈
#include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...
- 《剑指offer》面试题21 包含min函数的栈 Java版
(min函数的作用是返回栈内最小值) 首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack.至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考 ...
- 【剑指offer 面试题21】包含min函数的栈
思路: 通过增加一个辅助栈保存每个状态对应的最小值.栈实现的不完整,应该还包含empty()等常规函数. #include <iostream> #include <stack> ...
- 《剑指offer》面试题21—包含min函数的栈
题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ...
- 《剑指offer》面试题30. 包含min函数的栈
问题描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例: MinStack minSt ...
- 面试题三十:包含min函数的栈
定义一个栈的数据结构,请实现一个每次都能找到栈中的最小元素,要求时间复杂度O(1).意思就是说每次进栈出栈后,min函数总能在时间1的前提下找到.方法一:由于每次循序遍历栈的话时间复杂度为n,所以要想 ...
- 剑指Offer(三十):连续子数组的最大和
.# 剑指Offer(三十):连续子数组的最大和 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
- 剑指Offer(三十二):把数组排成最小的数
剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 剑指Offer(三十六):两个链表的第一个公共结点
剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
随机推荐
- iOS开发--沙盒
IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件 ...
- 9/24matplotlib使用入门
---恢复内容开始--- matplotlib的使用中有好几种输出风格,有matlab风格,和官方文档的as风格,各有所长,本文对比介绍官方文档中的使用风格. 我们画图的目的是要将函数以图像显示出来, ...
- 查看mysql主外键信息
SELECT *FROMinformation_schema.key_column_usage tWHERE t.constraint_schema = '库名称'AND t.constraint_ ...
- 利用javascript实现css操作
在很多情况下,都需要对网页上元素的样式进行动态的修改.在JavaScript中提供几种方式动态的修改样式,下面将介绍方法的使用.效果.以及缺陷. 1.使用obj.className来修改样式表的类名. ...
- redis windows版本下载
https://github.com/dmajkic/redis/downloads http://windows.php.net/downloads/pecl/snaps/redis/3.1.4rc ...
- Applying the Kappa architecture in the telco industry
https://www.oreilly.com/ideas/applying-the-kappa-architecture-in-the-telco-industry Kappa architectu ...
- DNS服务器原理介绍(一)
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终 ...
- web前端----css选择器样式
一.css概述 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,对html标签的渲染和布局 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 例如 二.c ...
- 【运维技术】Nexus私服安装配置常用问题
maven私服安装配置 软件安装及基本配置 安装配置 # 安装jdk,参考其他教程 mkdir -p /app/nexus2 # 创建目录 wget https://download.sonatype ...
- 干货:Java多线程详解(内附源码)
线程是程序执行的最小单元,多线程是指程序同一时间可以有多个执行单元运行(这个与你的CPU核心有关). 在java中开启一个新线程非常简单,创建一个Thread对象,然后调用它的start方法,一个 ...