每日一题——包含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操作时,就可能会导致原始栈中的最小元素不等于辅助栈栈顶元素的情况。(读者可自行画图理解)
相关文章
|
2天前
|
存储 算法
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
5 0
|
2天前
|
算法 C语言
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
8 0
|
2天前
|
算法
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
数据结构和算法学习记录——特殊线性表之栈(上)-栈的概念、栈的结构、链式栈数组栈、栈的结构体定义、栈的基本接口函数、栈顶初始化函数
2 0
|
2天前
|
算法
数据结构和算法学习记录——复习静态顺序表的两个接口函数(在指定位置插入数据,在指定位置删除数据)
数据结构和算法学习记录——复习静态顺序表的两个接口函数(在指定位置插入数据,在指定位置删除数据)
5 0
|
2天前
|
存储 算法
数据结构和算法学习记录——线性表之顺序表(顺序表概念、结构、顺序表接口函数-头插头删、尾插尾删)
数据结构和算法学习记录——线性表之顺序表(顺序表概念、结构、顺序表接口函数-头插头删、尾插尾删)
5 0
|
2天前
|
存储 机器学习/深度学习 算法
数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)
数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)
3 0
|
11天前
|
存储 Java 容器
深入浅出 栈和队列(附加循环队列、双端队列)
深入浅出 栈和队列(附加循环队列、双端队列)
|
4天前
|
存储 缓存 算法
【数据结构】栈和队列的模拟实现(两个方式实现)
【数据结构】栈和队列的模拟实现(两个方式实现)
TU^
|
16天前
|
存储 调度 索引
数据结构~~栈和队列
在计算机科学中,数据结构是构建高效程序的基础。栈和队列是两种重要且常用的线性数据结构,它们在解决各种问题中发挥着关键作用。
TU^
27 1
|
4天前
|
存储 编译器 数据处理
栈溢出及解决方法
栈溢出及解决方法