剑指Offer----面试题21:包含min函数的栈
2016-06-04 23:39
716 查看
题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。分析:
使用两个栈,一个数据栈,一个辅助栈,数据栈中存放数据,辅助栈中依次存放较小的值。源代码:
头文件StackWithMin.h#ifndef STACKWITHMIN_H #define STACKWITHMIN_H #include<stack> namespace StackWithMinSpace { class ThrowError{}; template<typename T> class StackWithMin { public: StackWithMin(void){} virtual ~StackWithMin(){} T &top(); const T &top() const; void pop(); void push(T const &t); const T &min() const; bool empty(); int size(); private: std::stack<T> dataStk; std::stack<T> minStk; }; } #endif
实现文件StackWIthMin.cpp
#include"StackWithMin.h" namespace StackWithMinSpace { template<typename T> bool StackWithMin<T>::empty() { return dataStk.empty(); } template<typename T> int StackWithMin<T>::size() { return dataStk.size(); } template<typename T> void StackWithMin<T>::push(T const &t) { dataStk.push(t); if (minStk.empty() || t < minStk.top()) minStk.push(t); else minStk.push(minStk.top()); } template<typename T> void StackWithMin<T>::pop() { if (dataStk.empty()) { throw ThrowError{}; } dataStk.pop(); minStk.pop(); } //const T &min() const; template<typename T> const T & StackWithMin<T>::min() const { if (minStk.empty()) { throw ThrowError{}; } return minStk.top(); } template<typename T> T &StackWithMin<T>::top() { if (dataStk.empty()) { throw ThrowError{}; } return dataStk.top(); } template<typename T> const T &StackWithMin<T>::top() const { if (dataStk.empty()) { throw ThrowError{}; } return dataStk.top(); } }
测试文件:
//#include"StackWithMin.h" #include"StackWithMin.cpp" #include<iostream> using std::cout; using std::endl; using namespace StackWithMinSpace; void test11() { StackWithMin<int> stk; stk.push(5); stk.push(4); stk.push(2); stk.push(2); stk.push(1); cout << "栈的大小" << stk.size() << endl; cout << "最小的数字为:" << stk.min() << endl; stk.pop(); cout << "栈的大小" << stk.size() << endl; cout << "最小的数字为:" << stk.min() << endl; stk.pop(); cout << "栈的大小" << stk.size() << endl; cout << "最小的数字为:" << stk.min() << endl; stk.pop(); cout << "栈的大小" << stk.size() << endl; cout << "最小的数字为:" << stk.min() << endl; } int main() { test11(); cout << endl; system("pause"); return 0; }
运行结果:
栈的大小5 最小的数字为:1 栈的大小4 最小的数字为:2 栈的大小3 最小的数字为:2 栈的大小2 最小的数字为:4 请按任意键继续. . .
另外转载一篇<模板类的定义和声明为什么要写在一起>的文章,欢迎阅读!
相关文章推荐
- 一个关于if else容易迷惑的问题
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 一道sql面试题附答案
- C# 超高面试题收集整理
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例