每日一题——包含min函数的栈

包含min函数的栈

    • 题目
    • 数据范围:
    • 示例
    • C语言代码实现
    • 解释
      • 1. `push(value)`
      • 2. `pop()`
      • 3. `top()`
      • 4. `min()`
    • 总结
    • 大小堆

题目

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 poptopmin 函数操作时,栈中一定有元素。

此栈包含的方法有:

  • push(value):将 value 压入栈中
  • pop():弹出栈顶元素
  • top():获取栈顶元素
  • min():获取栈中最小元素

数据范围:

  • 操作数量满足 0 ≤ n ≤ 300 0 \leq n \leq 300 0n300
  • 输入的元素满足 ∣ v a l ∣ ≤ 10000 |val| \leq 10000 val10000
  • 进阶:栈的各个操作的时间复杂度是 O ( 1 ) O(1) O(1),空间复杂度是 O ( n ) O(n) O(n)

示例

输入:

["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]

输出:

-1, 2, 1, -1

解析:

  • "PSH-1"表示将-1压入栈中,栈中元素为-1
  • "PSH2"表示将2压入栈中,栈中元素为2, -1
  • "MIN"表示获取此时栈中最小元素==>返回-1
  • "TOP"表示获取栈顶元素==>返回2
  • "POP"表示弹出栈顶元素,弹出2,栈中元素为-1
  • "PSH1"表示将1压入栈中,栈中元素为1, -1
  • "TOP"表示获取栈顶元素==>返回1
  • "MIN"表示获取此时栈中最小元素==>返回-1

C语言代码实现

#define MAX_SIZE 300  // 假设栈最大容量
int stack[MAX_SIZE]; // 定义一个整数数组作为栈的存储空间
int count = -1;      // 用于记录栈中元素的数量// 压入栈中的值
void push(int value) {if (count < MAX_SIZE - 1) {stack[++count] = value;} else {printf("Stack is full.\n");return;}
}// 弹出栈顶元素
void pop() {if (count == -1) {printf("Stack is empty.\n");return;}count--;
}// 获取栈顶元素
int top() {if (count == -1) {return -1;}return stack[count];  // 返回栈顶元素的值
}// 获取栈中最小的元素
int min() {if (count == -1) {return -1;}int minVal = stack[0]; for (int i = 1; i <= count; i++) {minVal = (minVal > stack[i]) ? stack[i] : minVal;}return minVal;
}

解释

1. push(value)

该函数负责将一个元素压入栈中。当栈未满时,将元素存入 stack 数组,并将栈顶指针 count 增加。

2. pop()

该函数负责弹出栈顶元素。当栈不为空时,栈顶元素被移除,栈顶指针 count 减少。

3. top()

该函数返回栈顶的元素。如果栈为空,返回 -1,否则返回栈顶的值。

4. min()

该函数遍历整个栈,找到最小的元素并返回。如果栈为空,返回 -1


总结

这题整体上还是很简单的,本以为是用大小堆实现的,没想到直接一个遍历就搞完了。明天研究一下如何用大小堆实现。

大小堆

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 300  // 假设栈最大容量// 定义堆的结构体
typedef struct {int data[MAX_SIZE];int size;  // 堆中的元素数量
} MinHeap;// 定义栈的结构体
typedef struct {int stack[MAX_SIZE];int top;MinHeap minHeap;
} Stack;// 堆的操作:插入元素
void insertMinHeap(MinHeap* heap, int value) {int i = heap->size++;heap->data[i] = value;// 维护堆的性质,逐步上浮while (i > 0 && heap->data[i] < heap->data[(i - 1) / 2]) {int temp = heap->data[i];heap->data[i] = heap->data[(i - 1) / 2];heap->data[(i - 1) / 2] = temp;i = (i - 1) / 2;}
}// 堆的操作:删除堆顶元素
void removeMinHeap(MinHeap* heap) {if (heap->size == 0) return;heap->data[0] = heap->data[--heap->size];// 维护堆的性质,逐步下沉int i = 0;while (2 * i + 1 < heap->size) {int left = 2 * i + 1;int right = 2 * i + 2;int smallest = i;if (left < heap->size && heap->data[left] < heap->data[smallest]) {smallest = left;}if (right < heap->size && heap->data[right] < heap->data[smallest]) {smallest = right;}if (smallest == i) break;int temp = heap->data[i];heap->data[i] = heap->data[smallest];heap->data[smallest] = temp;i = smallest;}
}// 堆的操作:获取堆顶元素
int getMin(MinHeap* heap) {return heap->size > 0 ? heap->data[0] : -1;
}// 初始化栈
void initStack(Stack* stack) {stack->top = -1;stack->minHeap.size = 0;
}// 压栈操作
void push(Stack* stack, int value) {if (stack->top < MAX_SIZE - 1) {stack->stack[++stack->top] = value;insertMinHeap(&stack->minHeap, value);} else {printf("Stack is full.\n");}
}// 弹栈操作
void pop(Stack* stack) {if (stack->top == -1) {printf("Stack is empty.\n");return;}int value = stack->stack[stack->top--];removeMinHeap(&stack->minHeap);
}// 获取栈顶元素
int top(Stack* stack) {if (stack->top == -1) {return -1;}return stack->stack[stack->top];
}// 获取栈中的最小元素
int min(Stack* stack) {return getMin(&stack->minHeap);
}int main() {Stack stack;initStack(&stack);push(&stack, -1);push(&stack, 2);printf("MIN: %d\n", min(&stack));  // 输出 -1printf("TOP: %d\n", top(&stack));  // 输出 2pop(&stack);printf("TOP: %d\n", top(&stack));  // 输出 -1printf("MIN: %d\n", min(&stack));  // 输出 -1return 0;
}

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

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

相关文章

【Linux系统】计算机世界的基石:冯诺依曼架构与操作系统设计

文章目录 一.冯诺依曼体系结构1.1 为什么体系结构中要存在内存&#xff1f;1.2 冯诺依曼瓶颈 二.操作系统2.1 设计目的2.2 系统调用与库函数 一.冯诺依曼体系结构 冯诺依曼体系结构&#xff08;Von Neumann Architecture&#xff09;是计算机的基本设计理念之一&#xff0c;由…

消息队列应用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系统设计》P343-P347

消息队列 使用信号量、事件标志组和线标志进行任务同步时&#xff0c;只能提供同步的时刻信息&#xff0c;无法在任务之间进行数据传输。要实现任务间的数据传输&#xff0c;一般使用两种方式&#xff1a; 1. 全局变量 在 RTOS 中使用全局变量时&#xff0c;必须保证每个任务…

【NLP251】Transformer精讲 残差链接与层归一化

精讲部分&#xff0c;主要是对Transformer的深度理解方便日后从底层逻辑进行创新&#xff0c;对于仅应用需求的小伙伴可以跳过这一部分&#xff0c;不影响正常学习。 1. 残差模块 何凯明在2015年提出的残差网络&#xff08;ResNet&#xff09;&#xff0c;Transformer在2016年…

Android学习制作app(ESP8266-01S连接-简单制作)

一、理论 部分理论见arduino学习-CSDN博客和Android Studio安装配置_android studio gradle 配置-CSDN博客 以下直接上代码和效果视频&#xff0c;esp01S的收发硬件代码目前没有分享&#xff0c;但是可以通过另一个手机网络调试助手进行模拟。也可以直接根据我的代码进行改动…

DeepSeek Janus-Pro:多模态AI模型的突破与创新

近年来&#xff0c;人工智能领域取得了显著的进展&#xff0c;尤其是在多模态模型&#xff08;Multimodal Models&#xff09;方面。多模态模型能够同时处理和理解文本、图像等多种类型的数据&#xff0c;极大地扩展了AI的应用场景。DeepSeek(DeepSeek-V3 深度剖析&#xff1a;…

OpenGL学习笔记(五):Textures 纹理

文章目录 纹理坐标纹理环绕方式纹理过滤——处理纹理分辨率低的情况多级渐远纹理Mipmap——处理纹理分辨率高的情况加载与创建纹理 &#xff08; <stb_image.h> &#xff09;生成纹理应用纹理纹理单元练习1练习2练习3练习4 通过上一篇着色部分的学习&#xff0c;我们可以…

代理模式——C++实现

目录 1. 代理模式简介 2. 代码示例 1. 代理模式简介 代理模式是一种行为型模式。 代理模式的定义&#xff1a;由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时&#xff0c;访问对象不适合或者不能直接访问引用目标对象&#xff0c;代理对象作为访问对象和目标…

攻防世界 fileclude

代码审计 WRONG WAY! <?php include("flag.php"); highlight_file(__FILE__);//高亮显示文件的源代码 if(isset($_GET["file1"]) && isset($_GET["file2"]))//检查file1和file2参数是否存在 {$file1 $_GET["file1"];$fi…

Vue 响应式渲染 - 列表布局和v-html

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 响应式渲染 - 列表布局和v-html 目录 列表布局 简单渲染列表 显示索引值 点击变色 V-html 作用 注意 采用策略 应用 总结 列表布局 简单渲染列表 Data中设置状态&#xff0c;是一个数组格式的默认信息。 然后…

LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略

LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之o3&#xff1a;《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的简介、安…

AI开发学习之——PyTorch框架

PyTorch 简介 PyTorch &#xff08;Python torch&#xff09;是由 Facebook AI 研究团队开发的开源机器学习库&#xff0c;广泛应用于深度学习研究和生产。它以动态计算图和易用性著称&#xff0c;支持 GPU 加速计算&#xff0c;并提供丰富的工具和模块。 PyTorch的主要特点 …

Python安居客二手小区数据爬取(2025年)

目录 2025年安居客二手小区数据爬取观察目标网页观察详情页数据准备工作&#xff1a;安装装备就像打游戏代码详解&#xff1a;每行代码都是你的小兵完整代码大放送爬取结果 2025年安居客二手小区数据爬取 这段时间需要爬取安居客二手小区数据&#xff0c;看了一下相关教程基本…

OpenCV:开运算

目录 1. 简述 2. 用腐蚀和膨胀实现开运算 2.1 代码示例 2.2 运行结果 3. 开运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 开运算应用场景 5. 注意事项 6. 总结 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;闭运算-CSDN博客 …

JavaWeb入门-请求响应(Day3)

(一)请求响应概述 请求(HttpServletRequest):获取请求数据 响应(HttpServletResponse):设置响应数据 BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器就可访问,应用程序的逻辑和数据都存储在服务端(维护方便,响应速度一般) CS架构:Client/ser…

【SLAM】于AutoDL云上GPU运行GCNv2_SLAM的记录

配置GCNv2_SLAM所需环境并实现AutoDL云端运行项目的全过程记录。 本文首发于❄慕雪的寒舍 1. 引子 前几天写了一篇在本地虚拟机里面CPU运行GCNv2_SLAM项目的博客&#xff1a;链接&#xff0c;关于GCNv2_SLAM项目相关的介绍请移步此文章&#xff0c;本文不再重复说明。 GCNv2:…

罗格斯大学:通过输入嵌入对齐选择agent

&#x1f4d6;标题&#xff1a;AgentRec: Agent Recommendation Using Sentence Embeddings Aligned to Human Feedback &#x1f310;来源&#xff1a;arXiv, 2501.13333 &#x1f31f;摘要 &#x1f538;多代理系统必须决定哪个代理最适合给定的任务。我们提出了一种新的架…

团体程序设计天梯赛-练习集——L1-025 正整数A+B

一年之际在于春&#xff0c;新年的第一天&#xff0c;大家敲代码了吗&#xff1f;哈哈 前言 这道题分值是15分&#xff0c;值这个分&#xff0c;有一小点运算&#xff0c;难度不大&#xff0c;虽然说做出来了&#xff0c;但是有两个小疑点。 L1-025 正整数AB 题的目标很简单…

Leetcode:598

1&#xff0c;题目 2&#xff0c;思路 脑筋急转弯&#xff0c;看题目一时半会还没搞懂意思。 其实不然就是说ops是个矩阵集合&#xff0c;集合的每个矩阵有俩个元素理解为行列边距 m和n是理解为一个主矩阵&#xff0c;计算ops的每个小矩阵还有这个主矩阵的交集返回面积 3&…

web前端12--表单和表格

1、表格标签 使用<table>标签来定义表格 HTML 中的表格和Excel中的表格是类似的&#xff0c;都包括行、列、单元格、表头等元素。 区别&#xff1a;HTML表格在功能方面远没有Excel表格强大&#xff0c;HTML表格不支持排序、求和、方差等数学计算&#xff0c;主要用于布…

【AI】探索自然语言处理(NLP):从基础到前沿技术及代码实践

Hi &#xff01; 云边有个稻草人-CSDN博客 必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。 目录 引言 1. 什么是自然语言处理&#xff08;NLP&#xff09;&#xff1f; 2. NLP的基础技术 2.1 词袋模型&#xff08;Bag-of-Words&#xff0c;BoW&#xff…