首页 > 试题广场 >

包含min函数的栈

[编程题]包含min函数的栈
  • 热度指数:657860 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 poptopmin 函数操作时,栈中一定有元素。

此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素

数据范围:操作数量满足 ,输入的元素满足
进阶:栈的各个操作的时间复杂度是 ,空间复杂度是

示例:
输入:    ["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

示例1

输入

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

输出

-1,2,1,-1
推荐
Ron头像 Ron
import java.util.Stack;
import java.util.Arrays;
public class Solution {
/*借用辅助栈存储min的大小,自定义了栈结构
*/
    private int size;
    private int min = Integer.MAX_VALUE;
    private Stack<Integer> minStack = new Stack<Integer>();
    private Integer[] elements = new Integer[10];
    public void push(int node) {
        ensureCapacity(size+1);
        elements[size++] = node;
        if(node <= min){
            minStack.push(node);
            min = minStack.peek();
        }else{
            minStack.push(min);
        }
    //    System.out.println(min+"");
    }

    private void ensureCapacity(int size) {
        // TODO Auto-generated method stub
        int len = elements.length;
        if(size > len){
            int newLen = (len*3)/2+1; //每次扩容方式
            elements = Arrays.copyOf(elements, newLen);
        }
    }
    public void pop() {
        Integer top = top();
        if(top != null){
            elements[size-1] = (Integer) null;
        }
        size--;
        minStack.pop();    
        min = minStack.peek();
    //    System.out.println(min+"");
    }

    public int top() {
        if(!empty()){
            if(size-1>=0)
                return elements[size-1];
        }
        return (Integer) null;
    }
    public boolean empty(){
        return size == 0;
    }

    public int min() {
        return min;
    }
} 

编辑于 2015-06-19 17:57:04 回复(57)
爽题
int stack[1000]={0}, pointStack=0;
void push(int node ) {
    int i;
    if(pointStack+1>=sizeof(stack))
        return;
    stack[pointStack++]=node;
}

int pop() {
    int node=0;
    if(pointStack<=0)
        return 0;
    node = stack[pointStack-1];
    stack[pointStack-1]=0;
    pointStack--;
    return node;
}

int top() {
    return stack[pointStack-1];
}

int min() {
    int res, i;
    if(pointStack<=0)
        return 0;
    res = stack[0];
    for(i=1; i<pointStack; i++) {
        if(stack[i]<res)
            res = stack[i];        
    }
    return res;
}


发表于 2024-03-17 17:26:02 回复(1)
int stack[301] = {0};
int top_i = -1;

void push(int value ) {
    top_i++;
    stack[top_i] = value;
}

void pop() {
    top_i--;
}

int top() {
    return stack[top_i];
}

int min() {
   
    int i = 0;//这里使用临时变量i来代替top_i,避免改变了栈顶指针
    int numMin = stack[i];//假设第一个元素为最小值
    if(top_i == 0)//栈中仅有一个元素时,直接返回元素
    {
           return stack[top_i];
    }
    for(i = 0; i <= top_i; i++)  //注意这里比较次数为元素个数
    {
        numMin = numMin < stack[i]  ? numMin : stack[i];
    }
    return numMin;
}
发表于 2023-09-29 00:27:58 回复(0)
int stack[300];
int count=0;

void push(int value ) {
    stack[count++]=value;
    printf("stack[%d]=%d\n",count-1,stack[count-1]);
}

void pop() {
    if(count==0)
    {
        return;
    }
    count--;
}

int top() {
    return stack[count-1];
}

int min() {
    //write code here
    if(count==0)
    {
        return -1;
    }
    int min=stack[0];
    for(int i=0;i<count;i++)
    {
        if(min>stack[i])
        {
            min=stack[i];
        }
    }
    return min;
}

发表于 2023-09-12 13:58:10 回复(0)
#define MAX_NUM 301
int s1[MAX_NUM],s2[MAX_NUM];
int top1 = MAX_NUM,top2 = MAX_NUM;
void push(int value ) {
    // write code here
    if(top1 > 0)
        s1[--top1] = value;
    else
        return;
    if(top2 == MAX_NUM || value<=s2[top2])
    {
        if(top2>0)
            s2[--top2] = value;
    }
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return 无
 */
void pop() {
    // write code here
    int node1 = -1;
    if(top1 < MAX_NUM)
        node1 = s1[top1++];
    else
        return;
    if(top2 < MAX_NUM && node1 == s2[top2])
        top2++;
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return int整型
 */
int top() {
    // write code here
    if(top1 < MAX_NUM)
        return s1[top1];
    return -1;
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return int整型
 */
int min() {
    // write code here
    if(top2 < MAX_NUM)
        return s2[top2];
    return -1;
}

发表于 2023-05-24 22:46:00 回复(0)
int stack[301] = {0};
int top_i = -1;

void push(int value ) {
    top_i++;
    stack[top_i] = value;
}

void pop() {
    top_i--; 
}

int top() {
    return stack[top_i];
}

int min() {
    int numMin = 1000;
    int i = top_i;
    while(i >= 0) {
        numMin = stack[i] < numMin ? stack[i] : numMin;
        i--;
    }
    return numMin;
}
发表于 2023-01-03 00:15:04 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param value int整型 
 * @return 无
 */
int list[300] = {0};
int num=0;
void push(int value ) {
    // write code here
    if(num<=300) {
        list[num++] = value;
    }
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return 无
 */
void pop() {
    // write code here
    if(num>0) {
        num--;
        list[num]=20000;
    }
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return int整型
 */
int top() {
    // write code here
    if(num>0) {
        return list[num-1];
    }
    return -1;
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return int整型
 */
int min() {
    // write code here
    int minV = list[0];
    for(int i=0; i<num; i++) {
        if(minV>list[i]) minV=list[i];
    }
    return minV;
}
发表于 2022-11-15 17:19:40 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param value int整型 
 * @return 无
 */

int arr1[301] = {0};    // 保存 value
int arr2[301] = {0};    // 保存 min
int minNumber = 10000;
int myIndex = 0;

void push(int value ) 
{
    // write code here
    arr1[myIndex]   = value;
    minNumber = value < minNumber ? value : minNumber;
    arr2[myIndex++] = minNumber;
    return;
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return 无
 */
void pop() 
{
    // write code here
    // minNumber = arr2[--myIndex];
    myIndex--;
    minNumber = arr2[myIndex - 1];
    return;
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return int整型
 */
int top() {
    // write code here
    int temp = myIndex;
    return arr1[--temp];
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param 无 
 * @return int整型
 */
int min() {
    // write code here
    return minNumber;
}

发表于 2022-11-12 21:08:31 回复(0)