剑指offer-面试题21.包含min函数的栈
2016-04-07 20:43
597 查看
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。
在该栈中,调用min,push及pop的时间复杂度都是O(1).
这一题实际上需要一个辅助栈存储最小值:
1.在模板类定义两个栈类型私有成员变量,一个为保存数据的栈另外一个为保存最小值的栈
2.当栈为空的时候直接将数据同时压入数据栈和最小值栈
3.当栈不为空的时候,将数据先压入数据栈同时比较该数据和最小值栈栈顶元素的大小
若大于最小值栈栈顶元素,则向最小值栈压入其栈顶元素,否则压入该数据到最小值栈
栈顶
4.当我们使用方法的时候直接取最小值的栈顶即为栈中的最小值
5.当我们要pop栈的时候应同时pop最小值栈的栈顶元素
代码实现如下:
MinStack.h
测试函数:
运行截图:
在该栈中,调用min,push及pop的时间复杂度都是O(1).
这一题实际上需要一个辅助栈存储最小值:
1.在模板类定义两个栈类型私有成员变量,一个为保存数据的栈另外一个为保存最小值的栈
2.当栈为空的时候直接将数据同时压入数据栈和最小值栈
3.当栈不为空的时候,将数据先压入数据栈同时比较该数据和最小值栈栈顶元素的大小
若大于最小值栈栈顶元素,则向最小值栈压入其栈顶元素,否则压入该数据到最小值栈
栈顶
4.当我们使用方法的时候直接取最小值的栈顶即为栈中的最小值
5.当我们要pop栈的时候应同时pop最小值栈的栈顶元素
代码实现如下:
MinStack.h
1 #ifndef _MINSTACK_H 2 #define _MINSTACK_H 3 4 #include <stack> 5 using namespace std; 6 7 template <typename T> 8 class StackWithMin 9 { 10 public: 11 void push(T data); 12 void pop(); 13 T min(); 14 private: 15 stack<T> DataStack; 16 stack<T> MinStack; 17 }; 18 19 template <typename T> void StackWithMin<T>::push(T data) 20 { 21 DataStack.push(data); 22 if(MinStack.empty()) 23 { 24 MinStack.push(data); 25 } 26 else 27 { 28 if(data>=MinStack.top()) 29 { 30 MinStack.push(MinStack.top()); 31 } 32 else 33 { 34 MinStack.push(data); 35 } 36 } 37 } 38 39 template <typename T> void StackWithMin<T>::pop() 40 { 41 MinStack.pop(); 42 DataStack.pop(); 43 } 44 45 template <typename T> T StackWithMin<T>::min() 46 { 47 if(!DataStack.empty()) 48 { 49 return MinStack.top(); 50 } 51 else 52 { 53 cout<<"不好意思栈空!"<<endl; 54 } 55 } 56 57 #endif
测试函数:
1 #include "MinStack.h" 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 StackWithMin<int> MinStack; 8 cout<<"请输入依次压入栈的数据(0-exit): "<<endl; 9 int data; 10 while(data!=0) 11 { 12 cin>>data; 13 if(data!=0) 14 MinStack.push(data); 15 } 16 cout<<endl; 17 cout<<"栈的最小值为: "<<MinStack.min()<<endl;; 18 19 return 0; 20 }
运行截图:
相关文章推荐
- 剑指offer-面试题20.顺时针打印矩阵
- 剑指offer-面试题19.二叉树的镜像
- 剑指offer-面试题18.树的子结构
- 剑指offer-面试题17.合并两个排序的链表
- 剑指offer-面试题16.反转链表
- 剑指offer-面试题15.链表中倒数第k个结点
- 剑指offer-面试题14.调整数组顺序使奇数位于偶数的前面
- 剑指offer-面试题13.在O(1)时间删除链表节点
- 剑指offer-面试题12.打印1到最大的n位数
- 剑指offer-面试题11.数值的整数次方
- 优秀程序员应具备的5项基本素质
- 优秀程序员应具备的5项基本素质
- 剑指offer-面试题10:二进制中1的个数
- LeetCode(32)-Binary Tree Level Order Traversal
- 剑指offer-面试题9.斐波拉契数列
- 剑指offer-面试题8.旋转数组的最小数字
- 剑指offter-面试题7.用两个栈实现队列
- 剑指offer-面试题6.重建二叉树
- 剑指offer-面试题5.从尾到头打印链表
- 剑指offer-面试题4.替换空格