Java的数组,栈,队列
import java.util.Arrays;
public class Array<E> {
private E[] data;
private int size;
//构造函数,传入数组的容量capacity构造Array
public Array(int capacity) {
this.data = (E[]) new Object[capacity];
size = 0;
}
//无参数构造函数
public Array() {
this(10);
}
//获取数组的个数
public int getSize() {
return size;
}
//获取数组的容量
public int getCapacity() {
return data.length;
}
//数组是否为空
public boolean isEmpty() {
return size == 0;
}
//添加最后一个元素
public void addLast(E e) {
add(size,e);
}
//添加第一个元素
public void addFirst(E e){
add(0,e);
}
//获取inde索引位置的元素
public E get(int index){
if (index < 0 || index >= size){
throw new IllegalArgumentException("Get failed,index is illegal");
}
return data[index];
}
public void set(int index,E e){
if (index < 0 || index >= size){
throw new IllegalArgumentException("Get failed,index is illegal");
}
data[index] = e;
}
//添加元素
public void add(int index,E e){
if (index > size || index < 0){
throw new IllegalArgumentException("add failed beceause index > size or index < 0,Array is full.");
}
if (size == data.length){
resize(data.length * 2);
}
for (int i = size - 1; i >= index; i--) {
data[i+1] = data[i];
}
data[index] = e;
size ++;
}
//扩容数组
private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
public E[] getData() {
return data;
}
//查找数组中是否有元素e
public boolean contains(E e){
for (int i = 0; i < size; i++) {
if (data[i].equals(e)){
return true;
}
}
return false;
}
//根据元素查看索引
public int find(E e){
for (int i = 0; i < size; i++) {
if (data[i].equals(e)){
return i;
}
}
return -1;
}
//删除某个索引元素
public E remove(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("detele is fail,index < 0 or index >= size");
}
E ret = data[index];
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size --;
data[size] = null;
if (size < data.length / 2){
resize(data.length / 2);
}
return ret;
}
//删除首个元素
public E removeFirst(){
return this.remove(0);
}
//删除最后一个元素
public E removeLast(){
return this.remove(size - 1);
}
//从数组删除元素e
public void removeElemen(E e){
int index = find(e);
if (index != -1){
remove(index);
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("");
sb.append(String.format("Array:size = %d,capacity = %d \n",size,data.length));
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(data[i]);
if (i != size - 1){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
}
队列
public class ArrayStack<E> implements Stack<E> {
Array<E> array;
public ArrayStack(int capacity) {
array = new Array<>(capacity);
}
public ArrayStack() {
this.array = new Array<>();
}
@Override
public int getSize() {
return array.getSize();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
@Override
public void push(E e) {
array.addLast(e);
}
@Override
public E pop() {
return array.removeLast();
}
@Override
public E peek() {
return array.getLast();
}
public int getCapacity(){
return array.getCapacity();
}
@Override
public String toString() {
StringBuilder res = new StringBuilder("");
res.append("Stack:");
res.append("[");
for (int i = 0; i < array.getSize(); i++) {
res.append(array.get(i));
if ( i != array.getSize() - 1){
res.append(",");
}
}
res.append("] top");
return res.toString();
}
}
队列
public class ArrayQueue<E> implements Queue<E> {
Array<E> array;
public ArrayQueue(int capacity) {
this.array = new Array<>(capacity);
}
public ArrayQueue() {
this.array = new Array<>();
}
@Override
public int getSize() {
return array.getSize();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
@Override
public void enqueue(E e) {
array.addLast(e);
}
@Override
public E dequeue() {
return array.removeFirst();
}
@Override
public E getFront() {
return array.getFirst();
}
public int getCapacity(){
return array.getCapacity();
}
@Override
public String toString() {
StringBuilder res = new StringBuilder("");
res.append("Queue [");
for (int i = 0; i < array.getSize(); i++) {
res.append(array.get(i));
if (i != array.getSize() - 1){
res.append(",");
}
}
res.append("] tail");
return res.toString();
}
public static void main(String[] args){
ArrayQueue<Integer> arrayQueue = new ArrayQueue<>();
for (int i = 0; i < 10; i++) {
arrayQueue.enqueue(i);
System.out.println(arrayQueue);
if (i % 3 == 2){
arrayQueue.dequeue();
System.out.println(arrayQueue);
}
}
}
}
第二种队列算法
public class LoopQueue<E> implements Queue<E>
{ private E[] data; private int front, tail; private int size; public LoopQueue(int capacity)
{
data = (E[]) new Object[capacity + 1];
} public LoopQueue()
{
this(10);
} @Override
public int getSize()
{
return size;
} @Override
public boolean isEmpty()
{
return size == 0;
} public int getCapacity()
{
return data.length - 1;
} //入队
@Override
public void enqueue(E e)
{
if (front == (tail + 1) % data.length)
{
resize(getCapacity() * 2);
}
data[tail] = e;
tail = (tail + 1) % data.length;
size++;
} private void resize(int newCapacity)
{
E[] newData = (E[]) new Object[newCapacity + 1];
for (int i = 0; i < size; i++)
{
newData[i] = data[(i + 1) % data.length];
}
data = newData;
front = 0;
tail = size; } //出队
@Override
public E dequeue() throws Exception
{
if (isEmpty())
{
throw new Exception("LoopQueue is isEmpty,dequeue is fail.");
}
E ret = data[front];
front = (front + 1) % data.length;
size--;
if (getCapacity() / 4 == size && getCapacity() / 2 != 0)
{
resize(getCapacity() / 2);
}
return ret;
} @Override
public E getFront() throws Exception
{
return data[front];
} @Override
public String toString()
{
StringBuilder res = new StringBuilder("");
res.append(String.format("LoopQueue:size = %d,getCapacity = %d \n",size,getCapacity()));
res.append("LoopQueue frot[");
for (int i = front;i != tail;i = (i + 1) % data.length)
{
res.append(data[i]);
if (tail != (i + 1) % data.length )
{
res.append(",");
}
}
res.append("] tail");
return res.toString();
}
public static void main(String[] args) throws Exception
{
LoopQueue<Integer> loopQueue = new LoopQueue<Integer>();
for (int i = 0; i < 10; i++)
{
loopQueue.enqueue(i);
if (i % 3 == 2)
{
loopQueue.dequeue();
}
System.out.println(loopQueue);
}
}
}
Java的数组,栈,队列的更多相关文章
- java 集合 Connection 栈 队列 及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- java面向对象的栈 队列 优先级队列的比较
栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一 ...
- Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较
判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...
- Java 容器之 Connection栈队列及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- 算法_队列的Java通用数组实现
在实现Queue的API的时候,可以使用两个实例变量做索引,一个变量head指向队列的开头,另一个变量tail指向队列的结尾.在删除一个元素的时候,使用head访问,并将head+1,插入一个元素的时 ...
- Java线程:堵塞队列与堵塞栈
一.堵塞队列 Java定义了堵塞队列的接口java.util.concurrent.BlockingQueue,堵塞队列是一个指定长度的队列,当试图向队列中添加元素而队列已满,或者是想从队列移出元素而 ...
- php中数组模拟队列、栈的函数以及数组指针操作
1,数组指针,current表示当前指针,输出其指向的元素:next表示指针移动到下一个元素:prev指针移动到上一个元素:end表示指针移动到最后一个元素:reset表示指针移动到第一个元素: &l ...
- 【学习总结】java数据结构和算法-第三章-稀疏数组和队列
相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...
- 三 基于Java动态数组手写队列
手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...
- Java数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
随机推荐
- 玩转Spring MVC(二)----MVC框架
早期程序员在编写代码时是没有一个规范的,系统的业务逻辑和数据库的访问时混合在一起的,不仅增加了大量的重复工作,而且增加了后期维护的难度. 后来,人们逐渐发现某些通用的功能是可以单独的封装起来的,这样就 ...
- bmob云代码中生成缩略图
function onRequest(request, response, modules) { var options = { url:"https://api.bmob.cn/1/ima ...
- vue 实践记录
打包后使用相对路径 在 build/webpack.prod.conf.js 的 output 节点添加配置:publicPath: './' 打包时使用shell复制文件 在入口 build/bui ...
- 用ASP.NET Core 2.0 建立规范的 REST API -- GET 和 POST
本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblogs.com/cgzl/p/9019314 ...
- Java并发编程(五)锁的使用(下)
显式锁 上篇讲了使用synchronized关键字来定义锁,其实Java除了使用这个关键字外还可以使用Lock接口及其实现的子类来定义锁,ReentrantLock类是Lock接口的一个实现,Reen ...
- 【NOI赛前训练】——专项测试1·网络流
T1: 题目大意: 传送门 给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1, ...
- 【bzoj 3309 】 DZY Loves Math
Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数a,b,求 ...
- BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针
BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针 Description Farmer John's owns N ...
- BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配
BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个 ...
- linux学习之路(3)
vim编辑器使用 命令模式:控制光标移动,可对文本进行复制.粘贴.删除和查找等工作. 输入模式:正常的文本录入. 末行模式:保存或退出文档,以及设置编辑环境. vim中常用命令: dd 删除(剪切) ...