AcWing36:用两个栈实现队列

Posted 劭兮劭兮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing36:用两个栈实现队列相关的知识,希望对你有一定的参考价值。

问题

原题链接:

用两个栈实现队列

在这里插入图片描述

解题思路

本小白在此选用的是JAVA语言:
根据本题,我们需要先来了解JAVA中的堆栈,
JAVA语言中有专门的 Stack类表示栈:

栈是Vector的一个子类,它实现了一个标准的后进先出的栈。

堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。

拓展:Vector类
Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:

  • Vector 是同步访问的。
  • Vector 包含了许多传统的方法,这些方法不属于集合框架。
    Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。

下面一起来看一下Vector类所特有的方法:
在这里插入图片描述
转入正题,本题目要用用两个栈实现队列,

  • 栈:先进后出
  • 队列:先进先出
  • 示意图:
    在这里插入图片描述

在本题中,我们声明定义两个栈,栈 stack1 用于 存储数组,栈 stack2 用于协助栈 stack1 完成取栈底元素等操作;即 一个主栈,用来存储数据;一个辅助栈,用来当缓存。
在这里插入图片描述
题目的要求如下:

  1. push(x) – 将元素x插到队尾;
  • 解析:将元素插到队尾,即将元素插到stack1的栈顶既可;
  • 代码实现:
    在这里插入图片描述
/** Push element x to the back of queue. */
    public void push(int x) {
        stack1.push(x);
    }
    
  1. pop() – 将队首的元素弹出,并返回该元素;
  • 解析:将队首元素弹出,即将 栈底元素 弹出,此时需要把 stack1 中的元素全部迁移到 stack2 中,取 stack2 中的栈顶元素,最后,将 stack2 中元素全部返回进入 stack1 中;
  • 代码实现:
    在这里插入图片描述
    在这里插入图片描述
/** Removes the element from in front of queue and returns that element. */
    public int pop() {
        if(!stack1.empty()) {
        	while(!stack1.empty()) {
        		stack2.push(stack1.pop());
        	}
        	
        	int popElement = stack2.pop();
        	
        	while(!stack2.empty()) {
        		stack1.push(stack2.pop());
        	}
        	return popElement;
        }
        return 0;
        
    }
    
  1. peek() – 返回队首元素;
  • 解析:此时我们需要弹出最先进入栈的元素,也就是栈底元素。我们可以先将所有元素从主栈中弹出,压入辅助栈中。则辅助栈的栈顶元素就是我们要返回的元素。然后再将辅助栈中的元素全部弹出,压入主栈中。
  • 代码实现:
    在这里插入图片描述
/** Get the front element. */
    public int peek() {
        if(!stack1.empty()) {
        	while(!stack1.empty()) {
        		stack2.push(stack1.pop());
        	}
        	int peekElement = stack2.peek();
        	while(!stack2.empty()) {
        		stack1.push(stack2.pop());
        	}
        	return peekElement;
        }
        
        return 0;
    }
  1. empty() – 返回队列是否为空;
  • 解析:判断主栈是否为空;
  • 代码实现:
    在这里插入图片描述
/** Returns whether the queue is empty. */
    public boolean empty() {
        if(stack1.empty()) {
        	return true;
        }else {
        	return false;
        }
    }
    

JAVA实现



class MyQueue {
	
	Stack<Integer> stack1 = new Stack<>();
	Stack<Integer> stack2 = new Stack<>();
	

    /** Initialize your data structure here. */
    public MyQueue() {

    }
    
    /** Push element x to the back of queue. */
    public void push(int x) {
        stack1.push(x);
    }
    
    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
        if(!stack1.empty()) {
        	while(!stack1.empty()) {
        		stack2.push(stack1.pop());
        	}
        	
        	int popElement = stack2.pop();
        	
        	while(!stack2.empty()) {
        		stack1.push(stack2.pop());
        	}
        	return popElement;
        }
        return 0;
        
    }
    
    /** Get the front element. */
    public int peek() {
        if(!stack1.empty()) {
        	while(!stack1.empty()) {
        		stack2.push(stack1.pop());
        	}
        	int peekElement = stack2.peek();
        	while(!stack2.empty()) {
        		stack1.push(stack2.pop());
        	}
        	return peekElement;
        }
        
        return 0;
    }
    
    /** Returns whether the queue is empty. */
    public boolean empty() {
        if(stack1.empty()) {
        	return true;
        }else {
        	return false;
        }
    }
}

/**
 * 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();
 */

小记:
原题链接:用两个栈实现队列

以上是关于AcWing36:用两个栈实现队列的主要内容,如果未能解决你的问题,请参考以下文章

用两个队列实现一个栈and用两个栈实现一个队列

用两个栈实现队列-剑指Offer

《剑指Offer——面试题9:用两个栈实现队列》代码

剑指offer-用两个栈实现队列

[剑指offer]面试题7:用两个栈实现队列

《剑指offer》— JavaScript用两个栈实现队列