• 栈和队列中比较简单的算法题


    1. 求栈中的最小值

    1.1 题目介绍

    请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。

    示例:

    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.getMin(); --> 返回 -3.
    minStack.pop();
    minStack.top(); --> 返回 0.
    minStack.getMin(); --> 返回 -2.

    1.2 解题思路

    利用两个栈,一个存储完整数据DataStack,一个只存储当前最小值MinStack。
    元素入栈时,和MinStack中的栈顶元素比较,如果小或者等于则将该元素分别压入DataStack和MinStack;
    若大则只将元素压入DataStack中,直至元素入栈完毕,最小值为MinStack的栈顶元素。
    

    代码实现

    //本题中可以直接引用现成的栈结构和方法
    class MinStack {
        private Stack<Integer> DataStack;
        private Stack<Integer> MinStack;
    
        public MinStack() {
            this.DataStack = new Stack<Integer>();
            this.MinStack = new Stack<Integer>();
        }
    	//入栈
        public void push(int newNum){
            if(this.MinStack.isempty()){
                this.MinStack.push(newNum);
            }else if(newNum < MinStack.getMin()){
                this.MinStack.push(newNum);
            }
            this.DataStack.push(newNum);
    
        }
    	//出栈
        public int pop(){
            if(this.DataStack.isempty()){
                throw new runtimeException("the stack is empty");
            }
            int Num = this.DataStack.pop();
            if(Num == this.getMin()){
                this.MinStack.pop();
            }
            return Num;
        }
    	//获得最小值
        public int getMin(){
            if(this.MinStack.isempty()){
                throw new runtimeException("the stack is empty");
            }
            return this.MinStack.peek();
        }
    
    }
    

    1.3 复杂度

    时间复杂度:O(1)
    空间复杂度:O(n)

    2.用两个栈来模拟一个队列

    2.1 题目介绍

    编写一个类,用两个栈实现队列,支持队列的基本操作(add, poll, peek)

    2.2 解题思路

    • 两个栈,一个做入队栈,另外一个做出队栈
    • 入队栈为空时,才能在出队栈中做出队操作
    • 出队栈不为空,不能向入队栈中压入元素

    代码实现

    public class TwoStacks_Queue{
    	private Stack<Integer> pushStack;
    	private Stack<Integer> popStack;
    	
    	public TwoStacks_Queue(){
    		pushStack = new Stack<Integer>();
    		popStack = new Stack<Integer>();
    	}
    	
    	//add 入队操作
    	public void add(int NewNum){
    		if(popStack.isEmpty()){
                //若入队列栈非空,将该栈元素迁移到出队栈
                while(!pushStack.isEmpty()){
                    popStack.push(pushStack.pop);
                }
                pushStack.push(NewNum);
            }
    	}
    	
    	//poll 出队操作
    	public int poll(){
    		if(pushStack.isEmpty() & popStack.isEmpty()){
    			throw new RuntimeException("队列为空");
    		//入队列栈非空,出队列栈为空时,将入队列栈元素全部移动到出队列栈
    		}else if(popStack.isEmpty()){
    			while(!pushStack.isEmpty()){
    				popStack.push(pushStack.pop());
    			}
    		}
    		return popStack.pop();
    	}
    	
    	//peek 查看队首元素 和poll函数类似
    	public int peek(){
    		if(pushStack.isEmpty() & popStack.isEmpty()){
    			throw new RuntimeException("队列为空");
    		//入队列栈非空,出队列栈为空时,将入队列栈元素全部移动到出队列栈
    		}else if(popStack.isEmpty()){
    			while(!pushStack.isEmpty()){
    				popStack.push(pushStack.pop());
    			}
    		}
    		return popStack.pop();
    	}
    }
    

    2.3 复杂度

    • 时间复杂度:O(N)
    • 空间复杂度:O(N)
  • 相关阅读:
    创建live usb
    gnome2.x面板(panel)或应用程序菜单误删后恢复
    grub & grub2
    linux(CentOS6)下的wifi热点安装配置------hostapd-2.0
    linux(Ubuntu)下的wifi热点安装配置------hostapd-2.0
    BZOJ3884 上帝与集合的正确用法(欧拉函数)
    Luogu4897 【模板】最小割树
    Contest 6
    BZOJ3811 玛里苟斯(线性基+概率期望)
    Contest 5
  • 原文地址:https://www.cnblogs.com/EthanWong/p/13449477.html
Copyright © 2020-2023  润新知