每日一題——包含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.pswp.cn/news/894427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894427.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RDP協議詳解

以下內容包含對 RDP&#xff08;Remote Desktop Protocol&#xff0c;遠程桌面協議&#xff09;及其開源實現 FreeRDP 的較為系統、深入的講解&#xff0c;涵蓋協議概要、歷史沿革、核心原理、安全機制、安裝與使用方法、擴展與未來發展趨勢等方面&#xff0c; --- ## 一、引…

【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;但是可以通過另一個手機網絡調試助手進行模擬。也可以直接根據我的代碼進行改動…

圖書管理系統 Axios 源碼__新增圖書

目錄 功能介紹 核心代碼解析 源碼&#xff1a;新增圖書功能 總結 本項目基于 HTML、Bootstrap、JavaScript 和 Axios 開發&#xff0c;實現了圖書的增刪改查功能。以下是新增圖書的功能實現&#xff0c;適合前端開發學習和項目實踐。 功能介紹 用戶可以通過 模態框&#xf…

DeepSeek Janus-Pro:多模態AI模型的突破與創新

近年來&#xff0c;人工智能領域取得了顯著的進展&#xff0c;尤其是在多模態模型&#xff08;Multimodal Models&#xff09;方面。多模態模型能夠同時處理和理解文本、圖像等多種類型的數據&#xff0c;極大地擴展了AI的應用場景。DeepSeek(DeepSeek-V3 深度剖析&#xff1a;…

AJAX XML

AJAX XML 引言 隨著互聯網技術的不斷發展,Web應用對用戶交互性和實時性的要求越來越高。AJAX(Asynchronous JavaScript and XML)技術的出現,為Web應用開發提供了強大的支持。AJAX技術允許Web應用在不重新加載整個頁面的情況下,與服務器進行異步通信。XML作為數據傳輸格式…

OpenGL學習筆記(五):Textures 紋理

文章目錄 紋理坐標紋理環繞方式紋理過濾——處理紋理分辨率低的情況多級漸遠紋理Mipmap——處理紋理分辨率高的情況加載與創建紋理 &#xff08; <stb_image.h> &#xff09;生成紋理應用紋理紋理單元練習1練習2練習3練習4 通過上一篇著色部分的學習&#xff0c;我們可以…

代理模式——C++實現

目錄 1. 代理模式簡介 2. 代碼示例 1. 代理模式簡介 代理模式是一種行為型模式。 代理模式的定義&#xff1a;由于某些原因需要給某對象提供一個代理以控制該對象的訪問。這時&#xff0c;訪問對象不適合或者不能直接訪問引用目標對象&#xff0c;代理對象作為訪問對象和目標…

Vue3 表單:全面解析與最佳實踐

Vue3 表單&#xff1a;全面解析與最佳實踐 引言 隨著前端技術的發展&#xff0c;Vue.js 已經成為最受歡迎的前端框架之一。Vue3 作為 Vue.js 的最新版本&#xff0c;帶來了許多改進和新的特性。其中&#xff0c;表單處理是 Vue 應用中不可或缺的一部分。本文將全面解析 Vue3 …

C++11新特性之范圍for循環

1.介紹 C11標準之前&#xff0c;使用for循環遍歷數組或容器&#xff0c;只能使用以下結構&#xff1a; for&#xff08;表達式1&#xff1b;表達式2&#xff1b;表達式3&#xff09;{ 循環體 } 那么在C11標準中&#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…

圖書管理系統 Axios 源碼__獲取圖書列表

目錄 核心功能 源碼介紹 1. 獲取圖書列表 技術要點 適用人群 本項目是一個基于 HTML Bootstrap JavaScript Axios 開發的圖書管理系統&#xff0c;可用于 添加、編輯、刪除和管理圖書信息&#xff0c;適合前端開發者學習 前端交互設計、Axios 數據請求 以及 Bootstrap 樣…

Vue 響應式渲染 - 列表布局和v-html

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue 響應式渲染 - 列表布局和v-html 目錄 列表布局 簡單渲染列表 顯示索引值 點擊變色 V-html 作用 注意 采用策略 應用 總結 列表布局 簡單渲染列表 Data中設置狀態&#xff0c;是一個數組格式的默認信息。 然后…

如何實現一個CLI命令行功能 | python 小知識

如何實現一個CLI命令行功能 | python 小知識 在現代軟件開發中&#xff0c;命令行界面&#xff08;CLI&#xff09;的設計與交互至關重要。Click是一個強大的Python庫&#xff0c;專門用于快速創建命令行界面&#xff0c;以其簡單易用性和豐富的功能贏得了開發者的青睞。本文將…

[SAP ABAP] Debug Skill

SAP ABAP Debug相關資料 [SAP ABAP] DEBUG ABAP程序中的循環語句 [SAP ABAP] 靜態斷點的使用 [SAP ABAP] 在ABAP Debugger調試器中設置斷點 [SAP ABAP] SE11 / SE16N 修改標準表(慎用)

kamailio-Core 說明書 版本:Kamailio SIP Server v6.0.x(穩定版)

Core 說明書 版本&#xff1a;Kamailio SIP Server v6.0.x&#xff08;穩定版&#xff09; 概述 本教程收集了 Kamailio 導出的函數和參數 core 添加到配置文件中。 注意&#xff1a;此頁面上的參數不按字母順序排列。 結構 kamailio.cfg 的結構可以看作是三個部分&#xff…

.Net / C# 繁體中文 與 簡體中文 互相轉換, 支持地方特色詞匯

版本號 Nuget 搜索 “OpenCCNET”, 注意別找錯, 好多庫的名字都差不多 支持 “繁,簡” 的互相轉換, 支持多個地區常用詞匯的轉換, 還支持 日文的新舊轉換. OpenCC 在 .Net 中的實現 https://github.com/CosineG/OpenCC.NET <PackageReference Include"OpenCCNET"…

Redis腦裂問題詳解及解決方案

Redis是一種高性能的內存數據庫&#xff0c;廣泛應用于緩存、消息隊列等場景。然而&#xff0c;在分布式Redis集群中&#xff0c;腦裂問題&#xff08;Split-Brain&#xff09;是一個需要特別關注的復雜問題。本文將詳細介紹Redis腦裂問題的成因、影響及解決方案。 一、什么是…