每日一题——包含min函数的栈(双栈法)

简介: 每日一题——包含min函数的栈(双栈法)

包含min函数的栈

题目链接

思路(双栈法)

  • 题目要求各个操作的时间复杂度为O(1),由栈的基本操作可知,入栈push,出栈pop,获取栈顶元素top都可以一步完成,时间复杂度为O(1),但获取栈中的最小元素min显然不是一步就能做到的,我们最先想到的肯定是遍历整个栈,找到最小元素,但这样时间复杂度就为O(n)了。
  • 因此,我们就需要创建一个辅助栈来存取最小值元素,来达到题目要求

具体步骤

  • 首先创建一个辅助栈stMin(辅助栈的栈顶元素用来存储原始栈的最小元素),和它的栈顶指针topMin,并初始化topMin为0
  • 每次对原始栈进行入栈push操作时,都将入栈元素value和stMin栈顶元素(原始栈的最小元素)进行比较,如果value大于等于stMin都栈顶元素时,则对stMin的栈顶元素重复入栈1;否则就将value入栈,更新最小值。
  • 进行出栈操作pop时,需要同时对原始栈和辅助栈进行pop操作

实现代码

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param value int整型 
 * @return 无
 */
//原始栈
static int stIn[300];
static int topIn = 0; 
//辅助栈
static int stMin[300];
static int topMin = 0;
void push(int value ) {
    if(value < stMin[topMin - 1] || topMin == 0)  //如果辅助栈为空或入栈元素小于最小值
        stMin[topMin++] = value;    //更新最小值
    else
    {
        stMin[topMin] = stMin[topMin-1];  //重复入栈
        topMin++;
    }
    stIn[topIn++] = value;
}
void pop() {
    topIn--;
    topMin--;
}
int top() {
    return stIn[topIn-1];
}
int min() {
    return stMin[topMin-1];
}

  1. 由于栈的元素遵循先进后出原则,如果入栈push的元素value都比stMin的栈顶元素大,却不对stMin的栈顶元素进行重复入栈操作,那么对原始栈和辅助栈同时进行pop操作时,就可能会导致原始栈中的最小元素不等于辅助栈栈顶元素的情况。(读者可自行画图理解)
相关文章
TU^
|
2天前
|
存储 调度 索引
数据结构~~栈和队列
在计算机科学中,数据结构是构建高效程序的基础。栈和队列是两种重要且常用的线性数据结构,它们在解决各种问题中发挥着关键作用。
TU^
12 1
|
1天前
|
缓存 Java 编译器
JavaSE精选-栈和队列
JavaSE精选-栈和队列
7 1
|
2天前
|
缓存 Java 编译器
栈和队列技术文章
栈和队列技术文章
|
2天前
数据结构(栈)
数据结构(栈)
6 0
|
3天前
|
存储
[数据结构]—栈和队列
[数据结构]—栈和队列
|
3天前
【错题集-编程题】点击消除(栈)
【错题集-编程题】点击消除(栈)
|
4天前
|
存储
【数据结构】栈(Stack)的实现 -- 详解
【数据结构】栈(Stack)的实现 -- 详解
|
5天前
|
缓存 算法 C语言
数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)
数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)
5 0
|
5天前
数据结构——栈
数据结构——栈
15 1
|
9天前
|
前端开发 JavaScript 算法
JavaScript 中实现常见数据结构:栈、队列与树
JavaScript 中实现常见数据结构:栈、队列与树