题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1).

参考题目:剑指offer第21题.

题目分析:

  1.采用面向对象思想,定义类StackWithMin,包含min、push和pop等方法;

  2.StackWithMin类中包含两个栈:一个数据栈,一个辅助栈。数据栈中是每次压入的实际数据,辅助栈中是对应数据栈的当前结点的最小值。

    解释:假设数据栈为stackdata,辅助栈为stackmin;令压栈数据依次为5-3-4-1-2;

       则压入5:stackdata:5 , stackmin:5

          压入3:----->stackdata:5-3 , stackmin:5-3

            压入4:----->stackdata:5-3-4 , stackmin:5-3-3

              压入1:----->stackdata:5-3-4-1 , stackmin:5-3-3-1

                 压入2:----->stackdata:5-3-4-1-2, stackmin:5-3-4-1-1

    stackdata即为压入的实际数据,stackmin中每次压入的数据和之前stackmin中的输入比较,如果比之前的小则压入当前,如果比之前的大则压入之前的数据。

#include <iostream>
#include <stack>
#include <cassert>using namespace std;template<class T>
class stackWithMin
{
public:stackWithMin(){}~stackWithMin(){}void push(const T& value);void pop();const T& min() const;void printStack();
private:stack<T> stackData;stack<T> stackMin;
};
template<class T>
void stackWithMin<T>::push(const T& value)
{stackData.push(value);//辅助栈为空或者压入的元素小于辅助栈的栈顶元素,则压入当前元素;否则压入栈顶元素if(stackMin.empty() || stackMin.top()>value)stackMin.push(value);elsestackMin.push(stackMin.top());
}
template<class T>
void stackWithMin<T>::pop()
{assert(stackData.size()>0 && stackMin.size()>0);stackData.pop();stackMin.pop();
}
template<class T>
const T& stackWithMin<T>::min() const
{assert(stackData.size()>0 && stackMin.size()>0);return stackMin.top();
}
template<class T>
void stackWithMin<T>::printStack()
{stack<T> tmp;cout << "当前栈中元素有:";while(stackData.size()){tmp.push(stackData.top());stackData.pop();}while(tmp.size()){stackData.push(tmp.top());cout << tmp.top();tmp.pop();}cout << endl;
}
int main(void)
{stackWithMin<int> minStack;minStack.push(5);minStack.printStack();cout << "最小元素为:" << minStack.min() << endl;minStack.push(3);minStack.printStack();cout << "最小元素为:" << minStack.min() << endl;minStack.push(4);minStack.printStack();cout << "最小元素为:" << minStack.min() << endl;minStack.push(1);minStack.printStack();cout << "最小元素为:" << minStack.min() << endl;minStack.push(2);minStack.printStack();cout << "最小元素为:" << minStack.min() << endl;return 0;
}

转载于:https://www.cnblogs.com/tractorman/p/4052675.html

包含min函数的栈 【微软面试100题 第二题】相关推荐

  1. 《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列

    一.构建乘积数组: 1.题目: 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*. ...

  2. 包含min函数的栈 python_面试题_设计包含 min函数的栈

    设计包含 min函数的栈() 定义栈的数据结构,要求添加一个 minminmin函数,能够得到栈的最小元素. 要求函数 min.push以及 pop 的时间复杂度都是 O(1). #include u ...

  3. [剑指offer]面试题21:包含min函数的栈

    面试题21:包含min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 栈内压入3.4.2.1之 ...

  4. 剑指offer:面试题30. 包含min函数的栈

    题目:包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). MinStack min ...

  5. 《LeetCode力扣练习》剑指 Offer 30. 包含min函数的栈 Java

    <LeetCode力扣练习>剑指 Offer 30. 包含min函数的栈 Java 一.资源 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调 ...

  6. 【简洁写法】剑指 Offer 30. 包含min函数的栈

    立志用最少的代码做最高效的表达 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例: MinSt ...

  7. java的min函数_Java语言实现包含min函数的栈

    package stack; import java.util.ArrayList; /** * 实现包含min函数的栈 * @author DHC * @param */ public class ...

  8. 【LeetCode】剑指 Offer 30. 包含min函数的栈

    [LeetCode]剑指 Offer 30. 包含min函数的栈 文章目录 [LeetCode]剑指 Offer 30. 包含min函数的栈 一.辅助栈 一.辅助栈 解题思路: 普通栈的 push() ...

  9. 剑指offer——30.包含min函数的栈

    题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 知识点: 这种需要持续输出最小或最大的数的解决办法之一:引入辅助栈 注意: 无 代码实现 ...

  10. 剑指offer——面试题21:包含min函数的栈

    剑指offer--面试题21:包含min函数的栈 Solution1: 辅助栈! 逻辑上要想清楚..但是用栈结构来实现栈,目的不知为何... class Solution { public:void ...

最新文章

  1. 甘利俊一 | 信息几何法:理解深度神经网络学习机制的重要工具
  2. PicoBlaze输入/输出端口
  3. 7-17 BCD解密(10 分)
  4. c语言第一课程序代码怎么打,【北北的小程序】北のC语言第一课:helloworld
  5. zjnu1730 PIRAMIDA(字符串,模拟)
  6. java数组显示最大值,java 如何用方法在数组中找到最大值并显示他的名称?
  7. 二十五、MongoDB 索引 和 explain 的使用
  8. eas库存状态调整单不能反审核_仓储管理笔记:库存差错、毁损赔偿、自用管理、组织架构.........
  9. 关于MD5破解这件事
  10. java如何判断当前系统是windows还是linux?
  11. Apache Kylin中对上亿字符串的精确Count_Distinct示例
  12. BERT大魔王为何在商业环境下碰壁?
  13. ADO编程:error C2011: 'LockTypeEnum' : 'enum' type redefinition
  14. Java学习-Thread
  15. iOS攻城狮修炼之路
  16. tcl/tk参考——列表操作lsearch
  17. 一些模拟器在配置文件内查找端口号的方式
  18. 【自然语言处理】【文本生成】UniLM:用于自然语言理解和生成的统一语言模型预训练
  19. java计算机毕业设计高校学生综合素质测评系统源码+mysql数据库+系统+lw文档+部署
  20. python英语词汇读音_利用Python制作查单词小程序(一):抓取来自百度翻译的单词释义和音标...

热门文章

  1. 各种Python简单功能代码
  2. 通过自动化接口调用InstallShield 报错的解决办法
  3. 举例在项目中动态构建自己的程序集,.NET产生动态程序集!
  4. Discuz!NT 在线用户功能简介(转)
  5. 201709020工作日记--synchronized、ReentrantLock、读写锁
  6. SQL执行效率2-执行计划
  7. 我为什么要理解storm的一些概念
  8. jQuery 实现图片动画代码
  9. 无限分级函数 简单 引用绑值
  10. nullnullHuge Pages