包含min函数的栈
2016-03-08 23:00
246 查看
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
分析:google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。
乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?
注意读题:对空间复杂的没有特别的要求,完全可以借助辅助空间!
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
代码如下:
数据测试:
题目来自: http://www.acmerblog.com/stack-with-min-5990.html
分析:google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。
乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?
注意读题:对空间复杂的没有特别的要求,完全可以借助辅助空间!
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
代码如下:
#include<iostream> #include<stack> using namespace std; class MinStack { public: void Push(int data); void Pop(); int Min(); void Print();//自定义一个输出栈元素的函数 private: stack<int> s; stack<int> s_GetMin;//辅助栈 }; void MinStack::Push(int data) { if (s.empty()) s_GetMin.push(data); else { int min = Min(); if (data < min) s_GetMin.push(data); else s_GetMin.push(min); } s.push(data); } void MinStack::Pop() { s_GetMin.pop(); s.pop(); } int MinStack::Min()//求得栈s此时的最小值 { return s_GetMin.top(); } void MinStack::Print() { cout << "分别输出栈s和辅助栈s_GetMin的元素(左竖是s,右竖是s_GetMin,数据从上往下的方向是从栈顶往栈底):\n"; while (!s.empty()) { cout << s.top() << " "; s.pop(); cout << s_GetMin.top() << endl; s_GetMin.pop(); } cout << endl; } int main() { MinStack minStack; minStack.Push(4); minStack.Push(1); minStack.Push(2); minStack.Push(1); minStack.Push(3); minStack.Push(5); minStack.Print(); return 0; }
数据测试:
题目来自: http://www.acmerblog.com/stack-with-min-5990.html
相关文章推荐
- 2016年3月8日JS做的字母大小写转换工具
- linux下单机LAMP网站架构
- 内存泄露分析
- web前端开发的MVC与MVP初探
- 异常处理总结
- function,procedure(异常处理)
- Android中自定义样式与View的构造函数中四个参数的意义
- ReactiveCocoa 学习心得 -- 1
- Spring MVC POST请求转到GET
- 建立个人简易的SMB服务器指南
- FORALL全解析
- 给个理由走下去——读《我是一只IT小小鸟》有感
- 猴子吃桃递归和尾递归--JavaScript版
- 吕小敏Legend
- _StringAPI
- 常用 Windows 7运行命令大全
- 全局 context
- Sklearn Reading1
- 免费的车辆违章车首页接口封装
- [BZOJ1093][ZJOI2007]最大半连通子图 强联通+拓扑排序+dp 做题笔记