Java之用栈实现队列

Posted

tags:

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

队列是一种典型的先进先出数据结构,队列的实现方式有很多种,比如数组,比如链表等,队列也可以用两个栈来实现,下面就用两个栈实现一个队列。

原理

  两个栈中,一个栈用来入队,叫他入队栈,另一个栈用来出队,叫出队栈。

  当入队时,我们直接把元素压入入队栈。

  当出队时,分两种情况:

         ①若出队栈不为空,则直接出队栈栈顶元素出栈

         ②若出队栈为空,则入队栈元素依次出栈并压入出队栈,然后出队栈出栈

技术分享

具体实现

  知道了原理后,实现起来就很简单啦,这里我们借助JDK中的java.util.stack类来作为我们队列中的栈,JDK实现的这个栈继承了Vector类,所以他的底层也是用到了数组。

  代码如下

package com.gdut.ds.queue;

import java.util.Stack;


/**
 * 用两个栈实现队列
 */
public class Queue<T> {
	/**
	 * 入队栈
	 */
	private Stack<T> inStack = new Stack<T>();
	
	/**
	 * 出队栈
	 */
	private Stack<T> outStack = new Stack<T>();
	
	/**
	 * 队列大小
	 */
	private int size;
	
	/**
	 * 入队
	 */
	public void enqueue(T obj) {
		inStack.push(obj);
		size++;
	}
	
	/**
	 * 出队
	 * @return
	 */
	public T dequeue() {
		T obj = null;
		if(outStack.empty()) {
			while(!inStack.empty()){
				outStack.push(inStack.pop());
			}
		}
		obj = outStack.pop();
		size--;
		return obj;
	}
	
	/**
	 * 队列的大小
	 * @return
	 */
	public int size() {
		return size;
	}
	
	/**
	 * 队列是否为空
	 * @return
	 */
	public boolean empty() {
		return size == 0;
	}
}

测试

        Queue<String> queue = new Queue<>();
        queue.enqueue("Hello");
        queue.enqueue("My");
        queue.enqueue("Name");
        queue.enqueue("is");
        queue.enqueue("YangHao");
        System.out.println(queue.size());
        while(!queue.empty()){
            System.out.println(queue.dequeue());
        }

  结果如下

5
Hello
My
Name
is
YangHao

  当队列没有元素时,Stack类会抛一个EmptyStackExcep。

 

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

剑指offer五之用两个栈实现队列

数据结构作业之用队列实现的基数排序(Java版)

Java新手入门200例126之用单向链表实现栈

数据结构 ---[链表 ] [使用链表实现栈 以及 队列 (Java代码实现)]

# Java 常用代码片段

# Java 常用代码片段