首页 > 后端开发 > C++ > 正文

c++中如何实现栈的最大值功能_c++栈最大值实现方法

穿越時空
发布: 2025-09-27 17:17:01
原创
901人浏览过
使用双栈法可在常数时间内获取栈最大值:dataStack存储数据,maxStack同步记录每步最大值。入栈时,maxStack压入当前最大值;出栈时同步弹出。优化版仅当新值≥maxStack栈顶时才压入,减少空间占用,pop时若弹出值等于最大值则更新maxStack。

c++中如何实现栈的最大值功能_c++栈最大值实现方法

在C++中实现的最大值功能,核心目标是:在常数时间内获取当前栈中的最大元素,同时不影响栈的常规入栈(push)、出栈(pop)操作。通常做法是使用辅助栈来同步记录每个状态下的最大值。

基本思路:双栈法

使用两个栈:

  • dataStack:存储实际数据。
  • maxStack:存储对应 dataStack 每个状态下的最大值。

每当有新元素入栈时,maxStack 也压入当前的最大值(新值与原最大值的较大者)。这样 maxStack 的栈顶始终代表当前栈的最大值。

代码实现

#include <iostream>
#include <stack>
using namespace std;

class StackWithMax {
private:
    stack<int> dataStack;
    stack<int> maxStack;

public:
    // 入栈
    void push(int value) {
        dataStack.push(value);
        if (maxStack.empty() || value >= maxStack.top()) {
            maxStack.push(value);
        } else {
            maxStack.push(maxStack.top());
        }
    }

    // 出栈
    void pop() {
        if (dataStack.empty()) return;
        dataStack.pop();
        maxStack.pop();
    }

    // 获取栈顶元素
    int top() {
        if (dataStack.empty()) throw runtime_error("Stack is empty");
        return dataStack.top();
    }

    // 获取最大值
    int getMax() {
        if (maxStack.empty()) throw runtime_error("Stack is empty");
        return maxStack.top();
    }

    // 判断是否为空
    bool empty() {
        return dataStack.empty();
    }
};

// 示例使用
int main() {
    StackWithMax s;
    s.push(3);
    s.push(5);
    cout << "当前最大值: " << s.getMax() << endl; // 输出 5
    s.push(2);
    s.push(8);
    cout << "当前最大值: " << s.getMax() << endl; // 输出 8
    s.pop();
    cout << "当前最大值: " << s.getMax() << endl; // 仍为 8?不对!应为 5?看逻辑。
    // 实际上,按上面实现,maxStack 同步更新,pop后自动回到前一个最大值
    return 0;
}

优化空间:节省内存的 maxStack

上面的方法简单直接,但 maxStack 和 dataStack 长度一致,占用较多空间。可以优化:maxStack 只在遇到更大或相等值时才压入。

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译

立即学习C++免费学习笔记(深入)”;

class StackWithMaxOptimized {
private:
    stack<int> dataStack;
    stack<int> maxStack;

public:
    void push(int value) {
        dataStack.push(value);
        if (maxStack.empty() || value >= maxStack.top()) {
            maxStack.push(value);
        }
    }

    void pop() {
        if (dataStack.empty()) return;
        int val = dataStack.top();
        dataStack.pop();
        if (val == maxStack.top()) {
            maxStack.pop();
        }
    }

    int getMax() {
        if (maxStack.empty()) throw runtime_error("Stack is empty");
        return maxStack.top();
    }
    // 其他方法类似... };

这种优化减少了 maxStack 的大小,只保存“关键”最大值节点。pop 时如果弹出的是当前最大值,才从 maxStack 中移除。

基本上就这些。两种方式都能实现 O(1) 时间获取最大值,第一种写法更直观,第二种更省空间。根据需求选择即可。

以上就是c++++中如何实现的最大值功能_c++栈最大值实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号