剑指offer——面试题30:包含min函数的栈
#include"iostream"
#include"stdio.h"
using namespace std; const int MAXN=;
const int INF=; template<typename T>class StackWithMin
{
public:
void push(const T& value);
void pop();
T min();
private:
int mSize=-;
int minNum=INF;
T* mData=new T[MAXN];
T* mMin=new T[MAXN];
}; template<typename T> void StackWithMin<T>::push(const T& value)
{
mData[++mSize]=value;
if(value<minNum)
{
minNum=value;
}
mMin[mSize]=minNum;
} template<typename T>void StackWithMin<T>::pop()
{
if(mSize<)
{
cout<<"stack is empty!"<<endl;
return;
}
mSize--;
} template<typename T>T StackWithMin<T>::min()
{
if(mSize<)
{
cout<<"stack is empty!"<<endl;
return INF;
}
return mMin[mSize];
} int main()
{
StackWithMin<double> s;
s.push();
cout<<s.min()<<endl;
s.push();
cout<<s.min()<<endl;
s.push();
cout<<s.min()<<endl;
s.push();
cout<<s.min()<<endl;
s.pop();
cout<<s.min()<<endl;
s.pop();
cout<<s.min()<<endl;
s.pop();
cout<<s.min()<<endl;
s.pop();
cout<<s.min()<<endl;
s.pop();
cout<<s.min()<<endl; return ;
}
官方代码:
// 面试题30:包含min函数的栈
// 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min
// 函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 #pragma once #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
{
return m_data.size();
}
StackWithMin.h
// 面试题30:包含min函数的栈
// 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min
// 函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。 #include <cstdio>
#include "StackWithMin.h" 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, ); return ;
}
test.cpp
只能说官方还是厉害,早知道用栈来模拟栈。。。
剑指offer——面试题30:包含min函数的栈的更多相关文章
- 剑指offer面试题30.包含min函数的栈
一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...
- 剑指Offer:面试题21——包含min函数的栈(java实现)
问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...
- 剑指Offer - 九度1522 - 包含min函数的栈
剑指Offer - 九度1522 - 包含min函数的栈2013-12-01 23:44 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测 ...
- 剑指offer(20)包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...
- 剑指offer二十之包含min函数的栈
一.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 二.思路 用一个栈dataStack保存数据,用另外一个栈minStack保存依次入栈最小的数.每次元素存入minSt ...
- 【剑指Offer】20、包含min函数的栈
题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 解题思路: 使用两个stack,一个为数据栈,另一个为辅助栈.数据栈 ...
- 《剑指offer》面试题30. 包含min函数的栈
问题描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例: MinStack minSt ...
- 剑指 Offer 30. 包含min函数的栈 + 双栈实现求解栈中的最小值
剑指 Offer 30. 包含min函数的栈 Offer_30 题目描述: 题解分析: 题目其实考察的是栈的知识,本题的目的是使用两个栈来求解最小值. 第二个栈主要用来维护第一个栈中的最小值,所以它里 ...
- 剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例 ...
- 力扣 - 剑指 Offer 30. 包含min函数的栈
题目 剑指 Offer 30. 包含min函数的栈 思路1 使用一个辅助栈min_stack,用来维护栈的最小的元素 每次添加元素入栈时候,data_stack和min_stack都要同时维护 dat ...
随机推荐
- iOS Orientation获取
[iOS Orientation获取] 1.[[UIDevice sharedInstance] orientation] 必须调用beginGeneratingDeviceOrientationNo ...
- sed修改json内容
1.config.json { "whiteHoleUrl": "http://172.16.80.90/whui/serviceManagement/regist/ne ...
- swoole1.8.0+版本异步redis安装(本实例为swoole1.8.10版本)详解
Swoole-1.8.0+版本增加了对异步Redis客户端的支持,基于redis官方提供的hiredis库实现.Swoole提供了__call魔术方法,来映射绝大部分Redis指令(本次安装实例为sw ...
- swift -懒加载创建view
// 只有外界访问到headerView的时候才会去执行闭包, 然后将闭包的返回值赋值给headerView // 注意: 一定要记住闭包后面需要写上(), 代表执行闭包 //懒加载 ...
- 服务器如何打开ping命令
服务器禁止ping后忘记是用什么方法禁止的了.只知道不是使用ip策略现在需要再开启ping...请问该怎么弄? 是不是windows防火墙开启了啊,到控制面板里的windows防火墙中看看,把防火墙关 ...
- 轉:Jquery绑定img的click事件
用JQUERY给IMG element绑定click事件的时候,直接用img.click(function(){...})不起作用,如下面代码$("img.ms-rteImage-Light ...
- php autoload 笔记
php auotload 实现了类的延迟加载机制,需要的时候在include,平时很少用到.它的实现原理搜了一下如下(不是本人研究的结果): 检查执行器全局变量函数指针autoload_func是否为 ...
- corss、inner、outer三种join方式
cross join(没有on)inner join(一般用于交集)outer join(你懂得)后面两个 on 1=1 效果同cross join
- (zxing.net)一维码Code 93的简介、实现与解码
一.简介 一维码Code 93: Code 93码与Code 39码的字符集相同,但93码的密度要比39码高,因而在面积不足的情况下,可以用93码代替39码.它没有自校验功能,为了确保数据安全性,采用 ...
- JavaWeb -pageContext/request/session/application
pageContext/request/session/application总结 一.范围差异 1. pageContext jsp页面容器 当前页面有效 2. request 请求对象 同一次请求 ...