题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的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);
else
stackMin.push(stackMin.top());
}
template<class T>
void stackWithMin<T>::pop()
{
assert(stackData.size()> && stackMin.size()>); stackData.pop();
stackMin.pop();
}
template<class T>
const T& stackWithMin<T>::min() const
{
assert(stackData.size()> && stackMin.size()>); 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();
minStack.printStack();
cout << "最小元素为:" << minStack.min() << endl; minStack.push();
minStack.printStack();
cout << "最小元素为:" << minStack.min() << endl; minStack.push();
minStack.printStack();
cout << "最小元素为:" << minStack.min() << endl; minStack.push();
minStack.printStack();
cout << "最小元素为:" << minStack.min() << endl; minStack.push();
minStack.printStack();
cout << "最小元素为:" << minStack.min() << endl; return ;
}

包含min函数的栈 【微软面试100题 第二题】的更多相关文章

  1. 面试经典-设计包含min函数的栈

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

  2. 剑指Offer面试题:19.包含Min函数的栈

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

  3. 【编程题目】设计包含 min 函数的栈

    2.设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 我的思路: 用一个额外的 ...

  4. 【面试题021】包含min函数的栈

    [面试题021]包含min函数的栈  MinStack.cpp: 1234567891011121314151617181920212223242526272829303132333435363738 ...

  5. 包含min函数的栈 ,二叉树的镜像

    包含min函数的栈 问题 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 代码 # -*- coding:utf-8 -*- class Sol ...

  6. 算法: 包含min函数的栈

    * @Description 包含min函数的栈* @问题:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).* @思路: 1:Stack 类中的p ...

  7. 《剑指offer》 包含min函数的栈

    本题来自<剑指offer> 包含min函数的栈 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 思路: 举例子让抽象问题具体 ...

  8. 41. 包含min函数的栈

    包含min函数的栈 描述 设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 ...

  9. 《剑指offer》第三十题(包含min函数的栈)

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

  10. 《剑指offer》— JavaScript(20)包含min函数的栈

    包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 实现代码 var stack = []; function push(node) { stack. ...

随机推荐

  1. Java面向对象(继承、抽象类)

    面向对象 今日内容介绍 u 继承 u 抽象类 第1章 继承 1.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成 ...

  2. 3285 转圈游戏 2013年NOIP全国联赛提高组

    3285 转圈游戏 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond       题目描述 Description n 个小伙伴 ...

  3. vue-cli3脚手架的配置以及使用

    Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供: 通过 @vue/cli 搭建交互式的项目脚手架. 通过 @vue/cli + @vue/cli-service-global  ...

  4. Ubuntu 设置静态ip地址

    1. 找到文件并作如下修改: sudo vim /etc/network/interfaces 修改如下部分: auto eth0iface eth0 inet staticaddress 192.1 ...

  5. 设置Cookie最大存活时间

    Cookie和Session都是由Tomcat自动创建的对象,Cookie的默认最大存活时间是 -1 ,即当浏览器关闭时Cookie就消失了:Session的默认最大存活时间是30分钟. 使用Sess ...

  6. vue搭建骨架屏步骤配置

    1.什么是骨架屏幕? 在页面加载数据之前,有一段空白时间,要么用loading加载,要么就用骨架屏. 在开发webapp的时候总是会受到首屏加载时间过长的影响,主流的解决方法是在载入完成之前显示loa ...

  7. Java 基础案例

    1.变量及基本数据类型 案例1:变量声明及赋值 //1.变量的声明 int a; //声明一个整型的变量a int b,c,d; //声明三个整型变量b,c,d //2.变量的初始化 int a = ...

  8. ABAP function group和Tomcat library重复加载问题

    ABAP ABAP help文档里对**LOAD-OF-PROGRAM"的关键字是这样描述的: This event keyword defines the program construc ...

  9. Java 守护线程(Daemon) 例子

    当我们在Java中创建一个线程,缺省状态下它是一个User线程,如果该线程运行,JVM不会终结该程序.当一个线被标记为守护线程,JVM不会等待其结束,只要所有用户(User)线程都结束,JVM将终结程 ...

  10. Acronis.Disk.Director磁盘分区管理

    Acronis.Disk.Director分为for 专业版和服务器版的,我在生产环境中调整Windows2003跳板机使用的是Acronis.Disk.Director Server 10.0.20 ...