当前位置: 首页 > article >正文

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

这个题目要求你设计一个特殊的栈(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.kler.cn/news/342184.html

相关文章:

  • nginx 启动报错 [emerg] getpwnam(“nginx”) failed
  • 代码随想录算法训练营Day18
  • Internet Download Manager6.42免费版下载神器新体验
  • codetop标签动态规划大全C++讲解(二)!!动态规划刷穿地心!!学吐了家人们o(╥﹏╥)o
  • 在线教育新篇章:SpringBoot系统开发策略
  • Vscode+Pycharm+Vue.js+WEUI+django火锅(三)理解Vue
  • WPF|依赖属性SetCurrentValue方法不会使绑定失效, SetValue方法会使绑定失效?是真的吗?
  • 2024.10月7~10日 进一步完善《电信资费管理系统》
  • 自动驾驶系列—从IMU到惯性定位算法:自动驾驶精准定位的幕后科技
  • 制造业人工智能的场景应用落地现状、难点和建议
  • 力扣10.9
  • 【数据结构】6道经典链表面试题
  • Ubuntu 更换内核版本
  • 单目三d重建学习笔记2024
  • 从开发效率到查询性能:JPA 和 MyBatis 在企业系统中的完美结合
  • Git 工作区、暂存区和仓库
  • 跟《经济学人》学英文:2024年10月05日这期 Workouts for the face are a growing business
  • python画图|步进图基本教程
  • 【C语言系统编程】【第三部分:网络编程】3.3 实践与案例分析
  • 解读 AI 获客关键要素,开启营销新未来