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。

时间: 2024-08-11 05:30:42

Java之用栈实现队列的相关文章

栈 VS 队列

linkStack.javalinkQueue.java程序强调栈和队列是概念上的实体,独立于它们的具体实现.用数组或者是用链表实现栈都是一样的.栈的重要性在于它的push()操作和pop()操作.以及如何使用它们;而非实现这些操作的内在机制. 什么时候该使用链表而非数组来实现的栈或者队列呢?取决于是否能精确地预测栈或者队列需要容纳的数据量.如果这点不甚清楚,链表就比数组表现出更好的适应性.两者都很快,所以速度不是考虑的重点. 链表 VS 数组如果需要随即存取元素N 那么用链表表示就不够好 因为

栈和队列的面试题Java实现

栈和队列的面试题Java实现 二.栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min()的栈,要求min.push.pop.的时间复杂度都是O(1) (6)判断栈的push和pop序列是否一致 1.栈的创建: 我们接下来通过链表的形式来创建栈,方便扩充. 代码实现: 1 public class Stack { 2 3 public Node he

栈和队列常见题型(java版)

直接上干货..... 栈和队列常见题型: 实现栈和实现队列. 两个栈实现一个队列. 设计栈,使得pop,push和min时间复杂度为O(1). 滑动窗口的最大值. 栈的进出序列. 实现栈和实现队列 主要包括:栈,队列,循环队列. package com.sywyg; /** * 实现栈 * 数组应该是Object类型的 * 注意top的设置影响出栈和获取栈顶元素. * size也可以用top代替 */ class MyStack<E>{ // 栈元素个数 private int size; /

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

Java数据结构与算法(第四章栈和队列)

本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构(链表.树等等)一样,都适用于数据应用中作数据记录. 然而,本章要讲解的是数据结构和算法更多的是作为程序员的工具来运用.它们组要作为构思算法的辅助工具,而不是完全的数据存储工具.这些数据结构的生命周期比那些数据库类型的结构要短的多.在程序操作执行期间它们才被创建,通常它们去执行某项特殊的任务,当完成之后,它们就被销毁. 受限访问 在数组中,只要知道下标就可以访问数据项.或顺

浅析栈与队列在java中的基本应用

一.前提 摘自java程序设计教程(华盛顿大学/斯坦福大学著,陈志等译)-机械工业出版社 1.1栈/队列基础 像线性表一样,栈与队列中存储一组有序的值.这类数据结构至少需要支持下面几种操作: 将值放入数据结构中(添加操作): 将值从数据结构中取出(删除操作): 检查数据结构中是否还有值(判断数据结构是否为空). 栈与队列很相似:都是以某种特定的顺序存储元素序列.栈是一种先进先出/LIFO(LAST IN FIRST OUT)的结构,也就是最后保存到结构中的元素会最先被访问.队列则是一种先进先出/

两个栈实现队列+两个队列实现栈----java

两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若stack2非空,我们需要的恰好再栈顶,出栈;若要给队列添加元素,即先进sack1,要出队时,若stack2不为空就出栈,为空时就把stack1全部进栈到stack2 二.两个队列实现一个栈 ps:图片原创于剑桥offer,来自网络 两个栈实现队列+两个队列实现栈----java,布布扣,bubuko.com

栈和队列的Java实现

一.  栈 1.概念 栈是一种特殊的线性表,它只能在栈顶(top)进行插入(push)和删除(pop)操作. 栈的常用操作: 入栈(push):向栈顶插入元素 出栈(pop):从栈顶删除元素 访问栈顶元素(peek):访问栈顶元素 2. 栈的顺序结构的实现 1 public class SequenceStack<T> { 2 3 private Object[] elementData; //数组用于承装元素 4 private int DEFAULT_SIZE = 20; //初始数组默认

java实现——007用两个栈实现队列

1 import java.util.Stack; 2 3 public class T007 { 4 public static void main(String[] args) { 5 Queue q = new Queue(); 6 q.stack1 = new Stack(); 7 q.stack2 = new Stack(); 8 q.appendTail(1); 9 System.out.println(q.stack1.toString()); 10 System.out.prin