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数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
随机推荐
- Python startswith()方法
描述 Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False.如果参数 beg 和 end 指定值,则在指定范围内检查. 语法 ...
- 开机出现loading (hd0)/ntldr。。。
电脑一开机就出现ntldr is missing的原因:1.操作系统文件损坏.2.MBR表损坏.3.硬盘数据线松了.4.硬盘坏了.解决方法:1.重新安装操作系统.2.用U盘或光盘引导,进入PE系统,用 ...
- 【bzoj 3233】[Ahoi2013]找硬币 ——搜索
Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...
- BZOJ_3940_[Usaco2015 Feb]Censoring_AC自动机
BZOJ_3940_[Usaco2015 Feb]Censoring_AC自动机 Description FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S.他有一个包含n个 ...
- 【小白学C#】谈谈C#多播委托因异常而终止的解决方案
一.前言 前几天,马三在与朋友闲聊技术的时候,朋友忽然抛出一个问题,把马三难倒了,本着求知的精神,回来以后马三就查阅了相关资料并做了一些实验,终于把问题搞明白了,因此写下本篇博客记录一下.首先,问题是 ...
- 后端传Long类型至前端js会出现精度丢失问题
今天开发遇到个问题,Java后端的Long类型数据,传到前端会出现精度丢失,如:164379764419858435,前端会变成164379764419858430.在浏览器中做测试可知,这就是一个精 ...
- 【爆料】-《布莱顿大学毕业证书》Brighton一模一样原件
布莱顿大学毕业证[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&am ...
- appium-desktop录制脚本二次开发,生成我司自动化脚本
目的 通过对appium-desktop脚本录制功能进行二次开发,使录制的java脚本符合我司自动化框架要求. 实现步骤 1.增加元素名称的输入框 由于ATK(我司自动化测试框架)脚本中元素是以“ap ...
- Shim 与 Polyfill
Shim: 用来向后兼容.比如 requestIdleCallback,为了在旧的环境中不报错,可以加 shim. 使用环境中现有的 api 来实现,不会引入额外的依赖或其他技术. Polyfill: ...
- 强化学习(十三) 策略梯度(Policy Gradient)
在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习.这种Value Based强化学习方法在很多领域都得到比较好的应用,但是Value Based强化学习方法也有很 ...