【剑指offer】09.用两个栈实现队列

197 阅读1分钟

题目描述

在这里插入图片描述

在这里插入图片描述


牛客:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

leetcode
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

题解


// 牛客
// 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。


import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
        if (stack2.isEmpty())
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        return stack2.pop();
    }
}
// 力扣
// 09. 用两个栈实现队列

// 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 
// 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整
// 数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )


// 63 ms , 在所有 Java 提交中击败了 31.32% 的用户
//  46.6 MB , 在所有 Java 提交中击败了 70.90% 的用户
import java.util.Stack;

class CQueue {
	// 定义栈变量
	private Stack<Integer> stack1;
	private Stack<Integer> stack2;
	
	public CQueue() {
		stack1 = new Stack<>();  // 赋予对象
		stack2 = new Stack<>();
	}
	
	public void appendTail(int value) {
		stack1.push(value);
	}
	
	public int deleteHead() {
		// 如果stack2是非空,则不往里存元素,直接看要不要弹出
		//如果stack2空,从stack1中出栈往里存
		if (stack2.isEmpty()) { 
			while (!stack1.isEmpty()) {  // 直到把stack1掏空为止
				stack2.push(stack1.pop());
			}
		}
		// 如果stack2空,且stack1也空,有可能导致转移完元素的stack2
		// 依然是空的,此时stack2.pop()会报错,所以还要检查一下非空
		if (!stack2.isEmpty()) 
			return stack2.pop()
		return -1;  // 如果真的没元素可取,直接返回-1
	}
}