栈和队列

作者: 奉先 | 来源:发表于2021-10-31 17:05 被阅读0次

1. 栈的概念介绍和Java API

向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2. 设计实现一个有getMin功能的栈 :

普通的栈包含pop()、push()方法,实现一个栈,可以在常数时间内实现返回栈内最小值。
实现该数据结构,只要使用2个栈即可,一个栈正常保存数据,一个栈保存最小值。下图表述了我的思路:


双栈实现getMin栈

下面是对思路的java代码实现 :

class MinStack {
    private Stack<Integer> stackData ; 
    private Stack<Integer> stackMin ;
    /** initialize your data structure here. */
    public MinStack() {
        stackData = new Stack<>() ; 
        stackMin = new Stack<>() ;
    }
    
    public void push(int x) {
        stackData.push(x) ; 
        if(stackMin.isEmpty() || x <=stackMin.peek()){
            stackMin.push(x) ;
        }
    }
    
    public void pop() {
        if(stackData.isEmpty()) return;
        int dataTop =  stackData.pop() ; 
        if(dataTop <= stackMin.peek()) {
            stackMin.pop();
        }
    }
    
    public int top() {
        return stackData.peek(); 
    }
    
    public int min() {
        return stackMin.peek(); 
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.min();
 */

3. 如何使用双栈实现队列 :

可以使用2个栈,一个栈负责队列入队数据(StackPush),一个栈负责队列出队数据(StackPop)。这个流程是这样的,先以1,2,3,4,5的顺序压入StackPush,那么StackPush里的元素从栈底到栈顶依次是:1,2,3,4,5; 这时再把所有元素从StackPush压入到StackPop,那么StackPop的元素从栈底到栈顶依次是:5,4,3,2,1。StackPop最终做pop的顺序就是1,2,3,4,5,与入队的顺序一致,实现了先入先出队列 。
但是从StackPush往StackPop同步时候,需要注意,请看下图的分析 :


StackPush和StackPop同步.png

下面给出Java的实现代码逻辑 :

class MyQueue {
    private Stack<Integer> stackPush ;
    private Stack<Integer> stackPop ;
    public MyQueue() {
        stackPush = new Stack<>() ;
        stackPop = new Stack<>() ;
    }
//    如果stackPop为空,将stackPush的所有元素压入stackPop
    private void pushToPop(){
        if(stackPop.isEmpty()){
            while (!stackPush.isEmpty()){
                stackPop.push(stackPush.pop()) ;
            }
        }
    }
    
    public void push(int x) {
        pushToPop();
        stackPush.push(x);
    }
    
    public int pop() {
        pushToPop();
        return stackPop.pop() ;
    }
    
    public int peek() {
        pushToPop();
        return stackPop.peek() ;
    }
    
    public boolean empty() {
        return stackPop.isEmpty() && stackPush.isEmpty() ; 
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

相关文章

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • 栈和队列

    用栈定义队列(出入栈) 用队列定义栈(数据队列和辅助队列)

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 栈和队列

    栈和队列 本质上是稍加限制的线性表 栈和队列定义 栈顺序栈定义 链栈结点定义 队列顺序队列 链队列链队类型定义 链...

  • Python实现栈和队列以及使用list模拟栈和队列

    Python实现栈和队列 Python使用list模拟栈和队列

  • 算法-栈和队列算法总结

    栈和队列算法总结 1 模拟 1.1 使用栈实现队列 1.2 使用队列实现栈 2 栈的应用 2.1 栈操作 2.2 ...

  • 算法分析 [BFS、Greedy贪心] 2019-02-18

    队列 和 栈 232. 用栈实现队列 Implement Queue using Stacks双栈,出队列时,将i...

  • 实 验 四 栈和队列

    一、实验目的与要求:## 1、理解栈和队列抽象数据类型。 2、掌握栈和队列的存储结构和操作实现。 3、理解栈和队列...

  • 栈、队列和链表

    基本数据结构 栈和队列 栈和队列都是动态集合。栈实现的是一种后进先出策略。队列是一种先进先出策略。 栈 栈上的in...

  • 算法导论 基本数据结构

    MIT公开课没有讲到的内容,介绍几种基本数据结构- 栈和队列- 链表- 二叉树 栈和队列 栈和队列都是动态集合,元...

网友评论

    本文标题:栈和队列

    本文链接:https://www.haomeiwen.com/subject/xwioaltx.html