数据结构队列的java实现,包括线性和链式两种方式
实现的思路为:
采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列:
接口代码如下:
package com.peter.java.dsa.interfaces; public interface Queue<T> { /* put item at rear of queue; */
void insert(T data); /* take item from front of queue */
T remove(); /* peek at front of queue */
T peek(); boolean isEmpty(); boolean isFull(); int size(); void clear();
}
线性栈的代码如下:
package com.peter.java.dsa.common; import com.peter.java.dsa.interfaces.Queue; public class LinearQueue<T> implements Queue<T> {
private int capacity;
private T[] t;
private int front;
private int rear;
private int size; public LinearQueue() {
// TODO Auto-generated constructor stub
capacity = 16;
t = (T[]) new Object[capacity];
front = -1;
rear = -1;
size = 0;
} public LinearQueue(int capacity) {
this.capacity = capacity;
t = (T[]) new Object[capacity];
front = -1;
rear = -1;
size = 0;
} @Override
public void insert(T data) {
// TODO Auto-generated method stub
if (isEmpty()) {
front = (front + 1) % t.length;
t[front] = data;
rear = (rear + 1) % t.length;
} else {
if (isFull()) {
resize();
}
rear = (rear + 1) % t.length;
t[rear] = data;
}
size++;
} @Override
public T remove() {
// TODO Auto-generated method stub
T tmp = null;
if (!isEmpty()) {
tmp = t[front];
t[front] = null;
front = (front + 1) % t.length;
size--;
}
return tmp;
} @Override
public T peek() {
// TODO Auto-generated method stub
T tmp = null;
if (!isEmpty()) {
tmp = t[front];
}
return tmp;
} @Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return front + rear == -2 && front == rear % t.length;
} @Override
public boolean isFull() {
// TODO Auto-generated method stub
return front == rear % t.length;
} @Override
public int size() {
// TODO Auto-generated method stub
return size;
} @Override
public String toString() {
// TODO Auto-generated method stub
StringBuffer buffer = new StringBuffer();
buffer.append("Linear Queue Content:[");
if (front < rear) {
for (int i = front; i < rear + 1; i++) {
buffer.append(t[i] + ",");
}
} else {
for (int i = front; i < t.length; i++) {
buffer.append(t[i] + ",");
}
for (int i = 0; i < rear + 1; i++) {
buffer.append(t[i] + ",");
}
}
buffer.append("]");
buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");
return buffer.toString();
} private void resize() {
int oldSize = t.length;
T[] tmp = (T[]) new Object[oldSize * 2];
for (int i = 0; i < oldSize; i++) {
tmp[i] = t[front];
front = (front + 1) % oldSize;
}
front = 0;
rear = oldSize - 1;
} @Override
public void clear() {
// TODO Auto-generated method stub
front = -1;
rear = -1;
} }
随着复习进度,后续代码会陆续更新。
数据结构队列的java实现,包括线性和链式两种方式的更多相关文章
- JAVA发送http GET/POST请求的两种方式+JAVA http 请求手动配置代理
java发送http get请求,有两种方式. 第一种用URLConnection: public static String get(String url) throws IOException { ...
- java中读取配置文件ResourceBundle和Properties两种方式比较
今天在开发的时候,需要把一些信息放到配置文件中,方便后续的修改,注意到用的是ResourceBundle读取配置文件的方式,记得之前也见过使用Properties的方式,就比较好奇这两种方式的区别,网 ...
- 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- java后台处理解析json字符串的两种方式
简单说一下背景 上次后端通过模拟http请求百度地图接口,得到的是一个json字符串,而我只需要其中的某个key对应的value. 当时我是通过截取字符串取的,后来觉得不太合理,今天整理出了两种处理解 ...
- Java多线程2:实现多线程的两种方式
原文:http://www.cnblogs.com/skywang12345/p/3479063.html 常见的实现多线程的方式有2种,一是继承Thread类,二是实现 Runnable接口,还可以 ...
- 【linux】linux查看资源任务管理器,使用top命令 + 查看java进程下的线程数量【两种方式】
================================ 详解:https://blog.csdn.net/achenyuan/article/details/77867661 ======= ...
- java多线程机制1(线程创建的两种方式)
进程:正在运行的程序.(即程序在内存中开辟了一片空间) 线程:是进程的执行单元. 一个进程至少包含了一个多个线程. 多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的.因为cp ...
- Java中创建String的两种方式
1.在Java中,创建一个字符串有两种方式 String x = "abc";String y = new String("abc"); 这两种方式有什么区别呢 ...
- 数据结构--队列(Java实现)
数据结构--队列(Java实现) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 队列是一种特殊的线性表,特殊之处在于它只 ...
随机推荐
- SSL/TLS协议运行机制的概述(转)
互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...
- 深入Java虚拟机——类型装载、连接(转)
来自http://hi.baidu.com/holder/item/c38abf02de14c7d31ff046e0 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Ja ...
- 使用requirejs实现模块化编程
> 序言 - -# 公司大了,业务多了,前端代码量也逐渐增大,我们渐渐的依赖js实现的交互越来越多,长期以来会导致我们的代码维护越来越困难,所以依赖的插件也越来越多..比如这样页面中有大量的js ...
- 《Java并发编程实战》第十四章 构建自己的同步工具定义 札记
一.状态依赖性的管理 有界缓存实现的基类 @ ThreadSafe public abstract class BaseBoundedBuffer<E> { @GuardeBy( &quo ...
- 【C++模版之旅】项目中一次活用C++模板(traits)的经历
曾经曾在一个项目中碰到过一个挺简单的问题,但一时又不能用普通常规的方法去非常好的解决,最后通过C++模板的活用,通过traits相对照较巧妙的攻克了这个问题.本文主要想重现问题发生,若干解决方式的比較 ...
- HTML5使用和实战分析HTML5 WebSocket API
通过引入一个简单的界面(请参见下面的列表),开发替代技术,由于长轮询和"永远框架,从而进一步减少延迟. 后台代码 [Constructor(in DOMString url, optiona ...
- 关联A850刷机包 高级电源 时间中心 优化 ROOT 动力 美化 简化
ROM简介 1.合并app以及framewok框架apk 2.破解安卓核心验证 3.加入busybox指令集 4.加入Root权限 5.时间居中显示.通知图标不会重叠 6.加入网速显示 7.加入%1精 ...
- EasyX
官方网站:http://www.easyx.cn/ 安装图解:http://www.easyx.cn/news/View.aspx?id=5 系统支持[1] 编译环境版本:Visual C+ ...
- XML的序列化和反序列化 详细介绍
为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...
- php_公共方法01_传入数组_打印可见信息
function decodeUnicode($str) { return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', 'convert', $str ...