C语言刷题 LeetCode 30天挑战 (十)Stack 栈 (MinStack)

news2024/11/26 12:14:07

这个题目要求你设计一个特殊的栈(MinStack),不仅要具备普通栈的基本功能(pushpoptop),还要能够在常数时间内(O(1) 时间复杂度)获取栈中的最小元素(getMin)。

基本栈操作如下:

  • push(x):将元素 x 压入栈顶。
  • pop():移除栈顶元素。
  • top():返回栈顶元素,但不移除它。
  • getMin():在常数时间内返回当前栈中最小的元素。

//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.

//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.

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

// 定义栈结构
typedef struct {
    int *stack;       // 存储所有元素的栈
    int *minStack;    // 辅助存储最小元素的栈
    int top;          // 主栈的栈顶指针
    int minTop;       // 最小栈的栈顶指针
    int capacity;     // 栈的容量
} Minstack;

// 创建 Minstack 并初始化
Minstack* minStackCreate() {
    Minstack* obj = (Minstack*)malloc(sizeof(Minstack));
    obj->capacity = 100;  // 假设初始容量为100
    obj->stack = (int*)malloc(sizeof(int) * obj->capacity);
    obj->minStack = (int*)malloc(sizeof(int) * obj->capacity);
    obj->top = -1;
    obj->minTop = -1;
    return obj;
}

// push 操作
void minstackPush(Minstack* obj, int x) {
    // 主栈操作
    obj->stack[++(obj->top)] = x;
    
    // 更新最小栈
    if (obj->minTop == -1 || x <= obj->minStack[obj->minTop]) {
        obj->minStack[++(obj->minTop)] = x;
    }
}

// pop 操作
void minstackPop(Minstack* obj) {
    if (obj->top == -1) return;  // 空栈
    int popped = obj->stack[obj->top--];  // 弹出主栈栈顶元素

    // 如果弹出的元素是当前最小值,也从 minStack 中弹出
    if (popped == obj->minStack[obj->minTop]) {
        obj->minTop--;
    }
}

// 获取栈顶元素
int minstackTop(Minstack* obj) {
    if (obj->top == -1) return -1;  // 空栈
    return obj->stack[obj->top];
}

// 获取栈中的最小元素
int minstackGetMin(Minstack* obj) {
    if (obj->minTop == -1) return -1;  // 空栈
    return obj->minStack[obj->minTop];
}

// 释放栈内存
void minstackFree(Minstack* obj) {
    free(obj->stack);
    free(obj->minStack);
    free(obj);
}

// 打印主栈和最小栈的内容
void printStack(Minstack* obj) {
    printf("Stack: ");
    if (obj->top == -1) {
        printf("Empty\n");
    } else {
        for (int i = 0; i <= obj->top; i++) {
            printf("%d ", obj->stack[i]);
        }
        printf("\n");
    }

    printf("MinStack: ");
    if (obj->minTop == -1) {
        printf("Empty\n");
    } else {
        for (int i = 0; i <= obj->minTop; i++) {
            printf("%d ", obj->minStack[i]);
        }
        printf("\n");
    }
}

int main() {
    Minstack* minstack = minStackCreate();
    
    minstackPush(minstack, -2);
    minstackPush(minstack, 9);
    minstackPush(minstack, -3);
    minstackPush(minstack, 1);
    minstackPush(minstack, 2);
    minstackPush(minstack, 3);

    printStack(minstack);  // 打印主栈和最小栈
    printf("getMin: %d\n", minstackGetMin(minstack));  // 返回 -3
    
    minstackPop(minstack);
    printStack(minstack);  // 打印主栈和最小栈

    printf("top: %d\n", minstackTop(minstack));        // 返回 0
    printf("getMin: %d\n", minstackGetMin(minstack));  // 返回 -2
    
    printStack(minstack);  // 打印主栈和最小栈
    minstackFree(minstack);  // 释放内存
    return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#的JSON序列化与反序列化

前言 记录使用C#进行json序列化和反序列化方法 一、序列化 序列化&#xff0c;即将数据组织成某种形式&#xff0c;存储在变量或文件中&#xff0c;是保存数据的一种方式。 下面以数据的形式存放数据&#xff0c;以字典的形式组织数据&#xff0c;将组织好的数据存放在json文…

计算机网络:物理层 —— 数据的传输方式

文章目录 传输方式串行传输串行传输方式特点应用 并行传输特点应用 网卡的串/并转换同步传输同步时钟频率的误差问题特点应用 异步传输特点应用 单向通信特点应用 双向交替通信特点应用 双向同时通信特点应用 传输方式 串行传输 串行传输是一种数据传输方式&#xff0c;指的是…

熵权法计算评价指标权重——使用Excel VBA实现

[ 熵权法 ] 信息是系统有序程度的一个度量&#xff0c;熵是系统无序程度的一个度量&#xff1b;根据信息熵的定义&#xff0c;对于某项指标&#xff0c;可以用熵值来判断某个指标的离散程度&#xff0c;其信息熵值越小&#xff0c;指标的离散程度越大&#xff0c; 该指标对综合…

大模型与生成式AI结合:HelpLook引领零售增长新篇章

近年来&#xff0c;零售行业在数字化、技术革新、经济波动及消费者需求多变的挑战下&#xff0c;展现出强大的适应性和创新力。AI技术的深度融合&#xff0c;正引领零售、电商、教育等领域&#xff0c;尤其是零售业步入一个生产力飞跃、客户至上的全新时代。企业亟需挖掘客户与…

Caffeine+Redis两级缓存架构

CaffeineRedis两级缓存架构 在高性能的服务项目中&#xff0c;我们一般会将一些热点数据存储到 Redis这类缓存中间件中&#xff0c;只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时&#xff0c;也能降低数据库的压力。 但是在一些场景下单纯使用 Redis 的分布…

24最新秋叶V4.9整合包发布!什么是Stable Diffusion?如何安装Stable Diffusion?

前言 Stable Diffusion秋叶整合包&#xff0c;一键安装Stable Diffusion&#xff0c;门槛极低&#xff0c;完全免费&#xff0c;支持Nvidia全系列显卡。 所有的AI设计工具&#xff0c;安装包、模型和插件&#xff0c;都已经整理好了&#xff0c;&#x1f447;获取~ Stable Di…

二叉树系列 10/11

一、二叉树中的伪回文路径 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数…

K8s中pod的管理和优化

一、k8s中的资源 1.1 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象 资源&#xff0c;用户需要通过操作资源来管理kubernetes。kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务所谓的部署服务&#xff0c;其实就是在kubernetes集群中…

MySQL中text类型对查询效率的影响

背景 任何设计都需要结合实际的需求或者说系统来做&#xff0c;我们现在服务端的整体设计趋向于领域驱动模型&#xff08;DDD&#xff09;。将业务抽象划分成各个独立领域对象&#xff0c;各个领域各尽其职&#xff0c;只负责自己领域的工作。回到MySQL设计&#xff0c;在我们将…

springboot查询全部部门流程

前端发送请求后&#xff0c;会请求DeptController的方法list()。 package com.intelligent_learning_aid_system.controller;import com.intelligent_learning_aid_system.pojo.Dept; import com.intelligent_learning_aid_system.pojo.Result; import com.intelligent_learni…

python安装插件

报错 E:\pythonProject\pythonProject_JD\Scripts\python.exe E:\浏览器下载\pythoncode\pythonProject_JD\car.py Traceback (most recent call last): File "E:\浏览器下载\pythoncode\pythonProject_JD\car.py", line 5, in <module> from selenium…

jdk 相关网址

官方资源&#xff1a; OpenJDK: https://openjdk.org/ OpenJDK 官方网站 (https://openjdk.org/) 是 Java 开发者的重要资源。以下是该网站的主要内容和功能&#xff1a; 项目概览 OpenJDK 的介绍和目标最新版本信息 下载 源代码下载预构建二进制文件链接 文档 开发者指南AP…

视频监控汇聚平台Liveweb安防监控平台实现接入监控视频集中管理方案

随着各行业数字化转型的不断推进&#xff0c;视频监控技术在行业内的安防应用及管理支撑日益增多。然而&#xff0c;由于前期规划不清晰、管理不到位等问题&#xff0c;视频监管系统普遍存在以下问题&#xff1a; 1. 各部门单位在视频平台建设中以所属领域为单位&#xff0c;导…

java多态-cnblog

java多态 细分的重载会增加代码量&#xff0c;降低易用程度 定义一个类&#xff0c;继承所有类的对象&#xff0c;根据向上转型可以让每个类的对象都调用初始类的方法&#xff0c;在方法中设置判断&#xff0c;不同的对象导致方法做不同的事&#xff0c;这就是多态 写一个灯…

C++:vector(题目篇)

文章目录 前言一、只出现一次的数字二、只出现一次的数字 II三、只出现一次的数字 III四、杨辉三角五、删除有序数组中的重复项六、数组中出现次数超过一半的数字七、电话号码的字母组合总结 前言 今天我们一起来看vector相关的题目~ 一、只出现一次的数字 只出现一次的数字…

Windows电脑安装FileBrowser文件管理系统结合内网穿透打造个人网盘

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…

数据结构:单链表OJ题

目录 相交链表解题思路代码 环形链表&#xff08;I&#xff09;解题思路代码 环形链表&#xff08;II&#xff09;解题思路代码 随机链表的复制&#xff08;深拷贝&#xff09;解题思路代码 相交链表 题目描述&#xff1a; 案例&#xff1a; 题目链接&#xff1a;https://l…

从边缘云到边缘AI,似乎边缘更有想象空间,你认同么?

【科技明说 &#xff5c; 科技热点关注】 前些天&#xff0c;我看到一个业内的行业分析说&#xff0c;边缘人工智能已经开始兴起&#xff0c;但是要到了2026年才会产生影响。这就意味着边缘AI的未来值得关注一下。 什么是边缘AI&#xff1f;边缘AI就是将人工智能处理功能带到了…

怎么找矩阵系统,怎么源码搭建,源头技术开发需要哪些支持

一、引言 在进行矩阵系统源码搭建时&#xff0c;选择合适的工具至关重要。正确的工具选择不仅可以提高开发效率&#xff0c;还能确保系统的稳定性、可扩展性和性能。本文将探讨在矩阵系统源码搭建过程中如何选择合适的工具。 二、前端开发工具选择 前端框架 React&#xff1a;由…

LLM大模型怎样进行数据和质量测试

大型语言模型&#xff08;LLMs&#xff09;的四种测试策略 测试机团队需要一套针对LLM的测试策略。在为嵌入在AI agent应用中的LLMs大模型制定测试策略时&#xff0c;可以考虑以下四点实践方法&#xff1a; 1&#xff09;创建测试数据以扩展软件质量保证 2&#xff09…