zoukankan      html  css  js  c++  java
  • 剑指offer 包含min函数的栈

    题目描述

    定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
     
    思路:我们可以用一个变量保存当前栈最小元素,但是当栈顶元素为最小元素,且被弹出时,变量应该保存次小元素,所以只用一个变量是不行的。也就是说,在我们保存最小元素之前,应该把次小元素保存起来。
    我们可以用辅助栈保存最小元素,每次新压入一个元素到栈中,比较辅助栈的栈顶元素(当前栈的最小元素),如果新压入的元素不大于栈顶元素(考虑了压入栈的元素值可能重复),则压入辅助栈,作为当前栈的最小元素。
    当弹出栈的元素时,如果弹出元素和辅助栈栈顶元素相同,说明应弹出辅助栈顶元素。
     
     
    步骤 操作 数据栈 辅助栈 最小值
    1 压入3 3 3 3
    2 压入4 3,4 3 3
    3 压入2 3,4,2 3,2 2
    4 压入1 3,4,2,1 3,2,1 1
    5 弹出 3,4,2 3,2 2
    6 压入2 3,4,2,2 3,2,2 2
    7 弹出 3,4,2 3,2 2
    8 弹出 3,4 3 3

     

     1 class Solution {
     2 public:
     3     stack<int> st1, st2; //st2作为辅助栈
     4     void push(int value) {
     5         st1.push(value); //直接压入栈st1中
     6         if (st2.empty()) //如果st2为空,直接将当前元素作为最小元素压入st2中
     7             st2.push(value);
     8         else if (value <= st2.top()) //如果当前新压入的元素不大于辅助栈栈顶元素,则压入辅助栈作为最小元素
     9             st2.push(value);
    10     }
    11     void pop() {
    12         if (st1.empty())
    13             return;
    14         if (st1.top() == st2.top())
    15             st2.pop();
    16         st1.pop();
    17     }
    18     int top() {
    19         if (!st1.empty())
    20             return st1.top();
    21         else
    22             return -1;
    23     }
    24     int min() {
    25         if (!st2.empty())
    26             return st2.top();
    27         else
    28             return -1;
    29     }
    30 };

     

  • 相关阅读:
    linux之vi编辑器的基础命令
    redis的安装部署启动停止<17.3.21已更新>
    关于Ubuntu的ssh免密登录
    Git(管理修改)
    Git(时光机-版本回退)
    Git(查看修改记录)
    Git(创建版本库)
    集中式VS分布式
    Git(介绍和安装)
    Javascript基础知识
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/11315091.html
Copyright © 2011-2022 走看看