引言

因为其他文章中用到了栈和队列,有时会进行改动。因此把实现贴在这里。

暂且不分析实现原理。

栈的实现

package com.algorithms.stack;import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Objects;/*** 采用头插法插入链表的栈的实现*/
public class Stack<Item> implements Iterable<Item>{private Node first; //指向链表的头结点private int sz;//size of stackprivate int modCount = 0;public Stack(){first = null;sz = 0;}public void push(Item item) {Node newNode = new Node();newNode.item = item;newNode.next = first;first = newNode;modCount++;}public Item pop() {Objects.requireNonNull(first);Item item = first.item;first = first.next;modCount++;return item;}public Item peek() {Objects.requireNonNull(first);return first.item;}public boolean isEmpty() {return first == null;}public int size() {return sz;}@Overridepublic Iterator<Item> iterator() {return new LinkedIterator(first);}private class LinkedIterator implements Iterator<Item> {private int expectedModCount = modCount;private Node cur;private LinkedIterator(Node p) {this.cur = p;}@Overridepublic boolean hasNext() {return cur !=null;}@Overridepublic Item next() {if (expectedModCount != modCount) {throw new ConcurrentModificationException();}if (!hasNext()) {throw new NoSuchElementException();}Item item = cur.item;cur = cur.next;return item;}}private class Node{Item item;Node next;}
}

队列的实现

package com.algorithms.queue;import java.util.Iterator;public class Queue<Item> implements Iterable<Item> {/*** 队列中元素个数*/private int sz = 0;/*** 指向队头和队尾*/private Node<Item> first, last;public Queue() {first = last = null;}public void enqueue(Item item) {Node<Item> oldlast = last;last = new Node<>(item);if (isEmpty()) {first = last;} else {oldlast.next = last;}sz++;}public Item dequeue() {if (isEmpty()) {throw new RuntimeException("the queue is empty!");}Item item = first.item;first = first.next;if (first == null)last = null;sz--;return item;}public boolean isEmpty() {return sz == 0;}public int size() {return sz;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder("[");//实现了Iterable就可以用foreach循环啦int i = 0;for (Item item : this) {if (i++ == size() - 1) {//提前返回return sb.append(item).append("]").toString();}sb.append(item).append(" ");}return sb.append("]").toString();}@Overridepublic Iterator<Item> iterator() {return new ListIterator();}/*** 这里推荐使用嵌套类而不是内部类** @param <Item>*/private static class Node<Item> {Item item;Node<Item> next;Node(Item item, Node<Item> next) {this.item = item;this.next = next;}Node(Item item) {this(item, null);}}/*** 这里要使用内部类,与外部类实例建立联系,不同的实例返回的迭代器不同*/private class ListIterator implements Iterator<Item> {private Node<Item> current = first;@Overridepublic boolean hasNext() {return current != null;}@Overridepublic Item next() {Item item = current.item;current = current.next;return item;}}
}

栈和队列的Java实现相关推荐

  1. 数据结构与算法之栈与队列:java实现

    闻理似悟,遇境则迷!!! 栈与队列来说也算是一种特殊的线性表,栈的特点是后进先出,队列的特点是先进先出. 栈 栈的特点是后进先出,栈的操作只有出栈和入栈(也叫压栈),除此之外,还包含栈顶与栈底的指向以 ...

  2. 表、栈和队列(JAVA实现)

    文章目录 1 概述 2 表 ADT 2.1 预先知识 2.1.1 Collection 接口 2.1.2 Iterator接口 2.2 List 表 的数组实现(ArrayList) 2.3 List ...

  3. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  4. 用两个栈实现队列(Java实现)

    用两个栈实现队列 题目 剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整 ...

  5. 代码随想录第十天 | 225. 用队列实现栈 232.用栈实现队列(Java))

    232.用栈实现队列 class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue( ...

  6. 栈和队列的Java实现_栈和队列的java简单实现

    栈:这是一个先进后出的数据结构,生活中类似的浏览器的返回上一页就可以利用此结构实现,代码如下: public class Stack{private Object[] data;//存储数据 priv ...

  7. 【剑指offer】面试题09:用两个栈实现队列(Java)

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

  8. 【LeetCode笔记】232. 用栈实现队列(Java、栈、队列)

    题目描述 经典题了,貌似现在面试也有点喜欢问,今天补补题! 要实现均摊时间复杂度O(1)噢 思路 & 代码 用两个栈来实现:输出栈 & 输入栈 输出栈 out:负责 pop.peek ...

  9. java 栈队列区别是什么意思_java栈和队列的区别

    Java中用LinkedList实现栈和队列_IT/计算机_专业资料.笔记摘录 栈和队列是两种特殊的线性表,它们的逻辑结构和线性表相同,只是其运算规则 较线性表有更多的限制,故...... 闽江学院电 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构( ...

最新文章

  1. eclipse导入Spring框架
  2. Linux 多线程应用中编写安全的信号处理函数
  3. 如何检查加载了哪个版本的jQuery?
  4. NLP之NBGBT:基于朴素贝叶斯(count/tfidf+网格搜索+4fCrva)、梯度提升树(w2c+网格搜索+4fCrva)算法对IMDB影评数据集进行文本情感分析(情感二分类预测)
  5. JUC锁-LockSupport(四)
  6. H3CNE新版本V6.0与旧版本V5.1的区别
  7. .NET Core 3 Preview 2发布,C#8更强大的模式匹配
  8. TCP/IP编程之SO_REUSEADDR和SO_REUSEPORT套接字选项
  9. oracle 交叉链接,Oracle里的交叉SQL语句写法-数据库专栏,ORACLE
  10. python根据年月日计算天数_「每日一练」Python实现输入年月日计算第几天
  11. Android 增量编译小解
  12. 如何安装Chrome OS系统
  13. 计算机视觉:步态识别-综述(一)
  14. 什么是在网上常说的“丢包”?
  15. 【100+ python基础入门-26】python修改列表元素方法
  16. 体育网站建设开发方案、开发流程
  17. php imap函数详解,Imap是什么意思,php imap 函数详解
  18. 特网云服务器 WindowsServer2012 关闭IE增强机制
  19. 误差向量幅度(EVM)
  20. python人脸识别代码_Python不用10行代码就可实现人脸识别,还可辨别真假,太棒了!...

热门文章

  1. Docker代理设置方法
  2. rhel与aix中,fsck -f的区别
  3. 14.ThreadLocal
  4. leetcode container-with-most-water(medium) /java
  5. mysql 数据表中查找重复记录(条数)
  6. REPNZ SCANS
  7. 二分图的匹配(未完)
  8. asp.net 获取计算机启动时间
  9. 一天一个小技巧(5)——CSDN编译器的图片位置、大小调节
  10. 链表简介(一)——创建单向动态链表及输出单向链表内容