三. 队列1 用2个栈实现队列

正如标题所述,你需要使用两个栈来实现队列的一些操作。

队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。
pop和top方法都应该返回第一个元素的值。

思路:这里有一个老哥的讨论感觉很有趣也很有用
我开始是考虑到了将一个用来导入,一个用来缓存,但是效率太低。不过,看到他的讨论的最后一个方案确实很不错,利用队列先进先出的性质,具体的就不转载了,链接里很详细。

Python3

class MyQueue:

    def __init__(self):
        self.stack1 = []
        self.stack2 = []
        
    def push(self, element):
        # write your code here
        self.stack1.append(element)
        
    def top(self):
        # write your code here
        # return the top element
        if self.stack2:
            return self.stack2[-1]
        else:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
            return self.stack2[-1]
            
    def pop(self):
        # write your code here
        # pop and return the top element
        if self.stack2:
            return self.stack2.pop()
        else:
            while self.stack1:
                self.stack2.append(self.stack1.pop())
            return self.stack2.pop()

在写这段代码的过程中犯了一个小错误导致memory limitation exceeding。
stack1.pop stack1.pop()

Java

public class MyQueue {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;

    public MyQueue() {
       // do initialization if necessary
       stack1 = new Stack<Integer>();
       stack2 = new Stack<Integer>();
    }
    
    public void push(int element) {
        // write your code here
        stack1.push(element);
        
    }

    public int pop() {
        // write your code here
        if (!stack2.empty())
        {
            return stack2.pop();
        }
        while(!stack1.empty())
        {
            int x = stack1.pop();
            stack2.push(x);
        }
        return stack2.pop();
    }

    public int top() {
        // write your code here
        if (!stack2.empty())
        {
            return stack2.peek();
        }
        while(!stack1.empty())
        {
            int x = stack1.pop();
            stack2.push(x);
        }
        return stack2.peek();
    }
}

在编写中遇到一些问题:

  1. int 与 integer的相等问题
    经过查阅,int 是一个数据类型,初值0; integer是一个int的包装类,初值null。但是在对比时,integer会拆箱和int对比,所以int == integer,只要值相等,就会相等。
    除此之外,两个新建的integer是不相等的(比较的是地址)。非新建的integer在-128-127之间,只要值相等就==(引用),但是如果不在这之间,就算值等他们也不==,因为他们会单独建立对象,互不引用。
    More
  2. 调用所有的函数还是建立新的对象,都会有()。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,759评论 18 399
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,516评论 0 3
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,205评论 30 471
  • 仲夏之夜,余突感嗓疼胸闷,干咳不止,仿有异物在喉难吐难咽!细思其因,嗜烟所致,深究其果,瘾伏于身,终日积成疾。更甚...
    雪忆0331阅读 186评论 0 0