zoukankan      html  css  js  c++  java
  • 栈和队列中比较简单的算法题

    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)
  • 相关阅读:
    「ZJOI2019」开关 (概率期望+FWT)
    FJWC2020 Day3 题解
    FJWC2020 Day1 题解
    「ZJOI2019」Minimax 搜索(动态dp)
    「十二省联考 2019」希望(长链剖分优化dp)
    CF1097F Alex and a TV Show(莫比乌斯反演+bitset)
    [Luogu#4707] 重返现世(minmax容斥+背包dp)
    201871010105曹玉中《面向对象程序设计(java)》第十周学习总结 曹玉中
    201871010105曹玉中《面向对象程序设计(Java)》第一周学习总结 曹玉中
    201871010105曹玉中《面向对象程序设计(java)》第四周学习总结 曹玉中
  • 原文地址:https://www.cnblogs.com/EthanWong/p/13449477.html
Copyright © 2011-2022 走看看