我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++怎么获取最小栈

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++怎么获取最小栈

本篇内容介绍了“C++怎么获取最小栈”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

最小栈

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.

  • pop() -- Removes the element on top of the stack.

  • top() -- Get the top element.

  • getMin() -- Retrieve the minimum element in the stack.

Example:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> Returns -3.
minStack.pop();
minStack.top();      --> Returns 0.
minStack.getMin();   --> Returns -2.

这道最小栈跟原来的栈相比就是多了一个功能,可以返回该栈的最小值。使用两个栈来实现,一个栈来按顺序存储 push 进来的数据,另一个用来存出现过的最小值。代码如下:

C++ 解法一: 

class MinStack {public:    MinStack() {}        void push(int x) {        s1.push(x);        if (s2.empty() || x <= s2.top()) s2.push(x);    }        void pop() {        if (s1.top() == s2.top()) s2.pop();        s1.pop();    }      int top() {        return s1.top();    }        int getMin() {        return s2.top();    }    private:    stack<int> s1, s2;};

Java 解法一:

public class MinStack {    private Stack<Integer> s1 = new Stack<>();    private Stack<Integer> s2 = new Stack<>();        public MinStack() {}      public void push(int x) {        s1.push(x);        if (s2.isEmpty() || s2.peek() >= x) s2.push(x);    }    public void pop() {        int x = s1.pop();        if (s2.peek() == x) s2.pop();    }       public int top() {        return s1.peek();    }      public int getMin() {        return s2.peek();    }}

需要注意的是上面的 Java 解法中的 pop() 中,为什么不能用注释掉那两行的写法,博主之前也不太明白为啥不能对两个 stack 同时调用 peek() 函数来比较,如果是这种写法,那么不管 s1 和 s2 对栈顶元素是否相等,永远返回 false。这是为什么呢,这就要看 Java 对于peek的定义了,对于 peek() 函数的返回值并不是 int 类型,而是一个 Object 类型,这是一个基本的对象类型,如果直接用双等号 == 来比较的话,肯定不会返回 true,因为是两个不同的对象,所以一定要先将一个转为 int 型,然后再和另一个进行比较,这样才能得到想要的答案,这也是 Java 和 C++ 的一个重要的不同点吧。

那么下面再来看另一种解法,这种解法只用到了一个栈,还需要一个整型变量 min_val 来记录当前最小值,初始化为整型最大值,然后如果需要进栈的数字小于等于当前最小值 min_val,则将 min_val 压入栈,并且将 min_val 更新为当前数字。在出栈操作时,先将栈顶元素移出栈,再判断该元素是否和 min_val 相等,相等的话将 min_val 更新为新栈顶元素,再将新栈顶元素移出栈即可,参见代码如下:

C++ 解法二: 

class MinStack {public:    MinStack() {        min_val = INT_MAX;    }      void push(int x) {        if (x <= min_val) {            st.push(min_val);            min_val = x;        }        st.push(x);    }       void pop() {        int t = st.top(); st.pop();        if (t == min_val) {            min_val = st.top(); st.pop();        }    }      int top() {        return st.top();    }        int getMin() {        return min_val;    }private:    int min_val;    stack<int> st;};

Java 解法二:

public class MinStack {    private int min_val = Integer.MAX_VALUE;    private Stack<Integer> s = new Stack<>();        public MinStack() {}      public void push(int x) {        if (x <= min_val) {            s.push(min_val);            min_val = x;        }        s.push(x);    }        public void pop() {        if (s.pop() == min_val) min_val = s.pop();    }       public int top() {        return s.peek();    }        public int getMin() {        return min_val;    }}

“C++怎么获取最小栈”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++怎么获取最小栈

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++怎么获取最小栈

本篇内容介绍了“C++怎么获取最小栈”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最小栈Design a stack that suppor
2023-06-20

C++中怎么获取文件大小

C++中怎么获取文件大小,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C++获取文件大小代码示例:#include < iostream> #include < io.h>
2023-06-17

linux怎么从变量中获取最小值

在Linux中,可以使用以下方法从变量中获取最小值:1. 使用sort命令:```min_value=$(echo "$variable" | tr " " "\n" | sort -n | head -n 1)```该命令首先使用`tr`
2023-08-23

在C++ 代码中怎么获取函数调用栈信息

这篇文章主要介绍“在C++ 代码中怎么获取函数调用栈信息”,在日常操作中,相信很多人在在C++ 代码中怎么获取函数调用栈信息问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在C++ 代码中怎么获取函数调用栈信息
2023-06-15

Python怎么获取字符串中最大和最小的字符

要获取字符串中最大和最小的字符,可以使用Python内置的max()和min()函数。text = "hello"max_char = max(text)min_char = min(text)print("最大字符:", max_c
Python怎么获取字符串中最大和最小的字符
2024-03-02

python字典怎么获取最大和最小value对应的key

这篇“python字典怎么获取最大和最小value对应的key”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python字典
2023-07-04

怎么获取localStorage最大存储大小的方法

这篇文章主要介绍怎么获取localStorage最大存储大小的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!localStorage,sessionStorage,cookie的简单介绍localStorage:
2023-06-09

在 MySQL 中获取最小值和最大值

我们需要使用 MAX(columnName) 来查找列中的最大值,而使用 MIN(columnName) 来查找列中的最大值。假设以下是语法查找特定列中的最高值和最低值 -mysql> SELECT @min_val:=MIN(column
2023-10-22

r语言怎么获取数组中的最大值和最小值

在R语言中,可以使用max()函数和min()函数来获取数组中的最大值和最小值。例如,假设有一个包含一组数字的数组x,要获取该数组中的最大值和最小值,可以使用以下代码:x <- c(1, 2, 3, 4, 5)max_value <-
r语言怎么获取数组中的最大值和最小值
2024-03-06

C#中获取文件大小问题怎么解决

本篇内容主要讲解“C#中获取文件大小问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中获取文件大小问题怎么解决”吧!C# 获取文件大小直接贴代码吧 ///
2023-07-05

c#怎么获取时间

如何在 c# 中获取时间?c# 中获取当前时间的方法有:1. datetime 类型,提供特定日期和时间信息;2. timespan 类型,表示时间间隔;3. 环境类,提供 utc 时间;4. stopwatch 类,用于测量执行时间。如何
c#怎么获取时间
2024-05-14

c#最小值怎么求

c# 中求最小值的方法有两种:使用 math.min() 方法比较数值表达式并返回最小值。使用 linq 的 min() 方法求取集合中最小元素的值。C# 中的最小值求法在 C# 中,求取最小值的方法主要有两种:1. 使用 Math.M
c#最小值怎么求
2024-05-12

C++中怎么获取文件

本篇文章给大家分享的是有关C++中怎么获取文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 char *txt = NULL; long txt
2023-06-17

java怎么获取文件大小

目前Java获取文件大小的方法有两种:1、通过file的length()方法获取;2、通过流式方法获取;通过流式方法又有两种,分别是旧的java.io.*中FileInputStream的available()方法和新的java..nio.*中的FileCha
java怎么获取文件大小
2016-09-27

JAVA怎么获取流的大小

在Java中,可以使用`InputStream`和`OutputStream`类的`available()`方法来获取流的大小。`available()`方法返回流中剩余字节数。以下是一个示例代码:```javaimport java.io
2023-08-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录