1. 简述

首先要决定使用链表结构实现还是顺序结构实现,对于顺序结构实现,当数据满的情况下进行Push时,需要开辟新的数组,进行复制,因此不能保证Push的时间复杂度为O(1);链表结构能够保证Push和Pop的时间复杂度为O(1)。Min的时间复杂度也要求O(1),通过空间换时间,分别记录链表,当包含一个节点时,最小值所在的节点,当包含两个节点时,最小值所在的节点,等等,直到所有节点时,最小值所在的节点。这样相当于两个链表,一个链表保存数值,另一个链表保存第一个链表中,对应节点范围内的最小值所在节点。

2. 实现

#include <iostream>
using namespace std;

// 友元,链接结构 
template<class T>
class Stack;

template<class T>
class Node {
  friend class Stack<T>;
private:
  T data;
  Node<T>* link;
};

template<class T>
class MinNode {
  friend class Stack<T>;
private:
  Node<T>* min_node;
  MinNode<T>* link;
};

template<class T>
class Stack {
private:
  Node<T>* head;
  MinNode<T>* min_head;
public:
  Stack(): head(0),min_head(0) { }
  ~Stack() {
    Node<T>* tmp;
    while(head) {
      tmp = head->link;
      delete head;
      head = tmp;
    }
    tmp = 0;
    MinNode<T>* min_tmp;
    while(min_head) {
      min_tmp = min_head->link;
      delete min_head;
      min_head = min_tmp; 
    }
    min_tmp = 0;
  }
  Stack<T>& Push(const T& data) {
    Node<T>* tmp = new Node<T>;
    tmp->data = data;
    tmp->link = head;
    head = tmp;
    MinNode<T>* min_tmp = new MinNode<T>;
    if(min_head > 0 && min_head->min_node->data < head->data)
      min_tmp->min_node = min_head->min_node; 
    else
      min_tmp->min_node = head; 
    min_tmp->link = min_head;
    min_head = min_tmp;
    return *this;
  }
  Stack<T>& Pop() {
    assert(head > 0);
    Node<T> *tmp = head->link;

    delete head;
    head = tmp;
    tmp = 0;
    MinNode<T> *min_tmp = min_head->link;
    delete min_head;
    min_head = min_tmp;
    min_tmp = 0;
    return *this;
  }
  void Min(T& data) {
    assert(head > 0);
    data = min_head->min_node->data;
  }
};

int main() {
  Stack<int> stack;
  int min;
  int array[10] = {3,4,5,6,7,2,1,0,9,8};
  for(int i=0; i<10; i++) {
    stack.Push(array[i]);
    stack.Min(min);
    cout << min << endl;
  }
  system("PAUSE");
  return 0;

}

3. 说明

· 对于Node, MinNode这样的节点类,把Stack声明为其友元,方便直接使用节点类的私有成员。
    · Push和Pop返回值类型为Stack<int>&,这样做是为了实现stack.push(1).push(2).push(3);这样调用方式。
    · 在参考资料中,有一份使用deque来实现内部结构的实现方式。

4. 参考

程序员面试题精选100题(02)-设计包含min函数的栈
    http://zhedahht.blog.163.com/blog/static/25411174200712895228171/

自定义栈-pop-push-min-时间复杂度都为O(1)相关推荐

  1. C++ template类模板实现栈 pop push

    心得 data = new T[size];这句太坑了,一开始写成了data = new T(size)圆括号,所以一直随机性报错. 我本来以为是ide的问题,在vs2017里就会崩,在dev里不会崩 ...

  2. 实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈

    一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素.同时,栈的基本操作:入栈(Push).出栈(Pop),也是在O(1)时间内完成的. 二,问 ...

  3. PTA 栈 (20分)(全网首发)(实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1))

    题目描述: 我们知道平凡的栈有几个操作: push(value) 将 value 压入栈 pop() 将栈顶元素弹出, 并返回这个弹出的元素. 现在我们想要在平凡栈的基础上实现以下几个操作: push ...

  4. 8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的

    8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的 转载于:https://www.cnblogs.com/yougmi/p/7766751.html

  5. 含有min()函数的栈,各种操作时间复杂度为O(1)

    设计一个栈,定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 声明:思想非原创 #include <iostream& ...

  6. 栈实现:入栈、出栈、取最小元素的时间复杂度都是O(1)。

    场景: 实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法.要保证这三个方法的时间复杂度都是O(1). 方法一: 设两个栈A/B,A:存放原始数据,B:栈顶为最小元素 ...

  7. 栈的push、pop序列

    题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...

  8. 学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一

    记得刚学多线程的时候, 碰到一个结构: //Delphi 的语法描述 PContext = ^TContext; _CONTEXT = recordContextFlags: DWORD;Dr0: D ...

  9. 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。

    题目:输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3 ...

最新文章

  1. S2S ×××如何穿越NAT
  2. 先验概率,后验概率,最大似然估计,最大后验概率
  3. 【Python】Matplotlib绘制日期型时间序列图
  4. 网管学习日记-ospf认证
  5. 机器人开发--技术路线简介
  6. ev3 android,乐高®头脑风暴教育机器人EV3编程
  7. 2018腾讯社交广告算法大赛总结/0.772229/Rank11-复习代码
  8. 六十星系之54廉贞破军坐卯酉
  9. a轮融资1亿多不多_A轮融资一共就三件重要的事情 B轮最重要的两件事
  10. Java入门,最全面最简单的Java基础教程
  11. 关于视频号主页实现一键添加个人微信功能的思路
  12. 【牛腩新闻发布系统之handler】
  13. 微信修改基本配置信息
  14. 阿里云技术大咖分享新内容新交互时代下的新技术、新机会
  15. word中页眉页脚问题处理方法
  16. 电脑读卡器,电脑上如何找到读卡器
  17. 两个女孩全程不带现金,只付加密货币几乎游遍大半个国家是一种什么体验?...
  18. 在matlab中怎样把图片转化为数据类型,matlab图像数据类型转换
  19. topsis(优劣解距离法)在matlab上的实现
  20. Python基础1——读取数据(公众号数据科学实践)

热门文章

  1. tomcat怎么平滑更新项目_SpringBoot内置tomcat启动原理
  2. 【 FPGA 】设置输出延迟(Output Delay)
  3. 【 MATLAB 】norm ( Vector and matrix norms )(向量范数以及矩阵范数)
  4. 【 MATLAB 】信号处理工具箱之波形产生函数 tripuls
  5. 【FPGA】Buffer专题介绍(二)
  6. 日常笔记——思科认证本地域登录
  7. mysql autocommit问题导致的gtid同步变慢
  8. day14--前端HTML、CSS
  9. iOS之HTTP和HTTPS的基本知识和应用
  10. MATLAB与C#混合编程