代码实现:

//1.3.29
package com.qiusongde.linkedlist; import java.util.Iterator;
import java.util.NoSuchElementException; import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut; public class CircularQueue<Item> implements Iterable<Item> { private Node last;
private int n; private class Node {
Item item;
Node next;
} public CircularQueue() {
last = null;
n = 0;
} public boolean isEmpty() {
return last == null;
} public int size() {
return n;
} public void enqueue(Item item) { Node oldlast = last;//save oldlast last = new Node();//new node
last.item = item;
if(oldlast == null) {//empty
last.next = last;
}
else {
last.next = oldlast.next;//next is first
oldlast.next = last;
} n++;
} public Item dequeue() {
if(isEmpty())
throw new NoSuchElementException("Queue is empty"); Item item = last.next.item; if(last.next == last) {//only one node
last = null;
} else {
last.next = last.next.next;
} n--; return item;
} @Override
public Iterator<Item> iterator() {
return new CircularQueueIterator();
} private class CircularQueueIterator implements Iterator<Item> { //it is important that this class cannot change the CircularQueue
//so we can only change precurrent and can't change precurrent.next
private Node precurrent; public CircularQueueIterator() {
precurrent = last;
} @Override
public boolean hasNext() {
return precurrent != null;
} @Override
public Item next() {
if(!hasNext())
throw new NoSuchElementException("Queue is empty"); Item item = precurrent.next.item; if(last == last.next) {//one node
precurrent = null;//end
} else {
precurrent = precurrent.next;
if(precurrent == last) {//precurrent equals last again
precurrent = null;//end
}
} return item;
} @Override
public void remove() {
throw new UnsupportedOperationException();
} } public static void main(String[] args) { CircularQueue<String> queue = new CircularQueue<String>();
StdOut.println("Initialized size:" + queue.size()); while (!StdIn.isEmpty()) { String item = StdIn.readString(); if (!item.equals("-")) { queue.enqueue(item);
StdOut.println("enqueue success:" + item + " size:" + queue.size()); StdOut.print("Left on queue: ");
for (String s : queue) {
StdOut.print(s + " ");
}
StdOut.println(); } else {
if(queue.isEmpty())
StdOut.println("dequeue error, queue empty");
else {
StdOut.println("dequeue success:" + queue.dequeue() + " size:" + queue.size()); StdOut.print("Left on queue: ");
for (String s : queue) {
StdOut.print(s + " ");
}
StdOut.println();
}
} } } }

测试数据;

to
be
or
not
to
-
be
-
-
that
-
-
-
is

输出结果:

Initialized size:0
enqueue success:to size:1
Left on queue: to
enqueue success:be size:2
Left on queue: to be
enqueue success:or size:3
Left on queue: to be or
enqueue success:not size:4
Left on queue: to be or not
enqueue success:to size:5
Left on queue: to be or not to
dequeue success:to size:4
Left on queue: be or not to
enqueue success:be size:5
Left on queue: be or not to be
dequeue success:be size:4
Left on queue: or not to be
dequeue success:or size:3
Left on queue: not to be
enqueue success:that size:4
Left on queue: not to be that
dequeue success:not size:3
Left on queue: to be that
dequeue success:to size:2
Left on queue: be that
dequeue success:be size:1
Left on queue: that
enqueue success:is size:2
Left on queue: that is

算法(Algorithms)第4版 练习 1.3.29的更多相关文章

  1. 1.2 Data Abstraction(算法 Algorithms 第4版)

    1.2.1 package com.qiusongde; import edu.princeton.cs.algs4.Point2D; import edu.princeton.cs.algs4.St ...

  2. 1.1 BASIC PROGRAMMING MODEL(算法 Algorithms 第4版)

    1.1.1 private static void exercise111() { StdOut.println("1.1.1:"); StdOut.println((0+15)/ ...

  3. ubuntu命令行下java工程编辑与算法(第四版)环境配置

    ubuntu命令行下java工程编辑与算法(第四版)环境配置 java 命令行 javac java 在学习算法(第四版)中的实例时,因需要安装配套的java编译环境,可是在编译java文件的时候总是 ...

  4. 配置算法(第4版)的Java编译环境

    1. 下载 1.1 JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html选择“Windows x64 180.5 ...

  5. 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列

    因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...

  6. 在Eclipse下配置算法(第四版)运行环境

    第一步:配置Eclipse运行环境 Eclipse运行环境配置过程是很简单的,用过Eclipse进行java开发或学习的同学应该都很熟悉这个过程了. 配置过程: (1)系统环境:Windows7 64 ...

  7. 排序算法总结(C语言版)

    排序算法总结(C语言版) 1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择 ...

  8. 算法(第四版)C#题解——2.1

    算法(第四版)C#题解——2.1   写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csh ...

  9. 《算法》第四版 IDEA 运行环境的搭建

    <算法>第四版 IDEA 运行环境的搭建 新建 模板 小书匠 在搭建之初,我是想不到会出现如此之多的问题.我看了网上的大部分教程,都是基于Eclipse搭建的,还没有使用IDEA搭建的教程 ...

  10. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

随机推荐

  1. 【前端阅读】——《JavaScript应用开发技术详解指南》摘记&思维导图

    读这本书,我主要关注三个部分:JavaScript内置函数,程序调试以及Ajax基础.由于多是介绍基本概念,所以,采用思维导图的方式,做了一个梳理,以下就是精简的主要内容. 注:转载请注明出处

  2. mysql使用mysqldump 与 mysqlimport进行数据库迁移

    1.导入数据库 1)source source /home/platvt/product/pc2_create_tables.sql 2)mysqlimport 使用mysqlimport导入数据: ...

  3. zoj3329--One Person Game(概率dp第六弹:形成环的dp,带入系数,高斯消元)

    One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very ...

  4. 常用快递API及快递在线下单API分享

    1.常用快递API 支持顺丰.EMS.申通.圆通.韵达.汇通.中通.天天.德邦.全峰等主流快递公司. 文档地址:https://www.juhe.cn/docs/api/id/43 1.1常用快递查询 ...

  5. vue2.0 仿手机新闻站(一)项目开发流程

    vue仿手机新闻站: 1.拿到静态页面,直接用vue边布局,边写 2.假数据 没有用任何UI组件,切图完成 做项目基本流程: 1.规划组件结构 Nav.vue Header.vue Home.vue ...

  6. template.js文档

    参见GitHub:https://github.com/yanhaijing/template.js/ template.js简介: template.js 一款javascript模板引擎,简单,好 ...

  7. vscode 编译调试c/c++的环境配置

    首先看了一下别人写的文章 http://blog.csdn.net/c_duoduo/article/details/51615381 在按照上文链接博主的安装步骤进行到MINGW的安装时出现一个问题 ...

  8. 一致性哈希算法(c#版)

    最近在研究"一致性HASH算法"(Consistent Hashing),用于解决memcached集群中当服务器出现增减变动时对散列值的影响.后来 在JAVAEYE上的一篇文章中 ...

  9. spring中xml配置和autowired混用

    1.类的混用: 配置文件中的配置: <bean id="a" class="com.ab.cc.A" /> 类中的配置 @Autowired A a ...

  10. Linux下Kafka单机安装配置方法

    Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: •Kafka将消息以topi ...