算法通关村-----队列的经典算法题

用两个栈实现队列

问题描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾

int pop() 从队列的开头移除并返回元素

int peek() 返回队列开头的元素

boolean empty() 如果队列为空,返回 true ;否则,返回 false

详见leetcode232

问题分析

使用两个栈实现队列,可以一个栈模拟队尾,入队元素入栈,可以一个栈模拟队头,出队元素出栈,当队头对应的栈为空时,可以将队尾对应的栈元素全部出栈,压入队头对应的栈。

代码实现

class MyQueue {
    Deque<Integer> inStack;
    Deque<Integer> outStack;

    public MyQueue() {
        inStack = new LinkedList<Integer>();
        outStack = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        inStack.push(x);
    }
    
    public int pop() {
        if(outStack.isEmpty()){
            while(!inStack.isEmpty()){
                int data = inStack.pop();
                outStack.push(data);
            }
        }
       return outStack.pop();
    }
    
    public int peek() {
        if(outStack.isEmpty()){
            while(!inStack.isEmpty()){
                int data = inStack.pop();
                outStack.push(data);
            }
        }
        return outStack.peek();
    }
    
    public boolean empty() {
        if(outStack.isEmpty()){
            while(!inStack.isEmpty()){
                int data = inStack.pop();
                outStack.push(data);
            }
        }
        return outStack.isEmpty();
    }
}

用两个队列实现栈

问题描述

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。

int pop() 移除并返回栈顶元素。

int top() 返回栈顶元素。

boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

详见leetcode225

问题分析

可以采用一个队列为主,一个队列为辅的形式。具体实现时,当有元素入栈时,先进入queue2队列,然后将queue1队列中的元素出队,进入queue2队列,再将queue2与queue1交换,如此,可使每次入栈元素放在队首,后续的出栈,查看栈顶元素都可在队头操作

代码实现

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public MyStack() {
        queue1 = new LinkedList<Integer>();
        queue2 = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        queue2.offer(x);
        while(!queue1.isEmpty()){
            int data = queue1.poll();
            queue2.offer(data);
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }
    
    public int pop() {
        return queue1.poll();
    }
    
    public int top() {
        return queue1.peek();
    }
    
    public boolean empty() {
        return queue1.isEmpty();
    }
}

你可能感兴趣的:(算法,数据结构,java)