剑指Offer-包含min函数的栈

题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

题目解析

这个题意思不明确,而且代码给出的部分参不透到底是要干嘛,可能我的理解有问题,经过一番折腾才明白是要自己重新写一个类Stack的类,但是包含min函数,能够自己求出他的最小值。


解题思路

我觉得这个题目本身含糊不清,题目给出的代码中,引入了Stack这个类,意思就是可以借助Stack来实现一个包含min方法的栈。或许题目这样出就是拐弯考察答题者的变通性,但是感觉这样做意义不大。

这个题目可以这样想:

定义两个栈,一个用于接收所有的数据,另一个只是用于存储最小的值,当pop的时候如果栈顶就是最小值,两者全部pop栈顶元素,然后只需要将包含所有数据的栈(以下成为stack1)全部出栈存储到另一个存储最小值的栈(以下称stack2)中去,在遍历的过程中求出哪个数据是最小的值,再将数据从stack2中导出到stack1中去,还原了原来的数据,这个地方算是稍微复杂一点的地方,其他的方法难度不大。


实现代码

import java.util.Stack;

public class Solution {

    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        
        stack1.push(node);
        if(stack2.empty()) {
           
           stack2.push(node); 
        }else{
            int node2 = stack2.peek();
        	if(node2 >= node) {
                stack2.pop();
            	stack2.push(node);
        	}
        }
        
    }
    
    public void pop() {
        
        if(stack1.peek() == stack2.peek()) {
            
            stack2.pop();
            stack1.pop();
            
            int index = 0;
            int min = 0;
            while(!stack1.empty()) {
                
                int data = stack1.pop();
            	
                if(index == 0)
                    min = data;
                else {
                    min = min > data ? data : min;
                }
                
                stack2.push(data);
              	index ++;
            }
            
            while(!stack2.empty()) {
                int data = stack2.pop();
                stack1.push(data);
            }
            
            stack2.push(min);
            
            return ;
        }
        stack1.pop();
    }
    
    public int top() {
        
        return stack1.peek();
    }
    
    public int min() {
        
        return stack2.peek();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值