用队列实现栈

我与影子孤独终老i 提交于 2020-01-17 18:30:41

题目:
使用队列实现栈的下列操作:

push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空

方法一: 用两个队列q1和q2实现栈,q1用来入栈,q2用来出栈,定义一个top用来标记栈顶元素。出栈时,将q1中的n-1个元素出栈,然后从q2入栈,最后将第n个元素出栈,交换两个队列的元素

class MyStack {
    Queue<Integer> q1;
    Queue<Integer> q2;
    int top;
    /** Initialize your data structure here. */
    public MyStack() {
        q1=new LinkedList<>();
        q2=new LinkedList<>();
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        top=x;
        q1.offer(x);
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        while(q1.size()>1){
            top=q1.poll();
            q2.offer(top);
        }
        int x=q1.poll();
        Queue q=q1;
        q1=q2;
        q2=q;
        return x;
    }
    
    /** Get the top element. */
    public int top() {
        return this.top;
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return q1.isEmpty()&&q2.isEmpty();
    }
}

方法二: 用一个队列实现栈,入栈直接从q入栈,出栈时先将q中的n-1个元素出栈后再入栈,然后将第n个元素出栈,求栈顶元素和出栈相同的方法,最后将第n个元素再出栈入栈即可

class MyStack {
    Queue<Integer> q;
    
    /** Initialize your data structure here. */
    public MyStack() {
        q=new LinkedList<>();
   
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
     
        q.offer(x);
    }
    public void shift(){
        for(int i=0;i<q.size()-1;i++){
            q.offer(q.poll());
        }
    }
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        shift();
        return q.poll();
    }
    
    /** Get the top element. */
    public int top() {
        shift();
        int x=q.poll();
        q.offer(x);
        return x;
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return q.isEmpty();
    }
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!