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数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
随机推荐
- bmob云代码中生成缩略图
function onRequest(request, response, modules) { var options = { url:"https://api.bmob.cn/1/ima ...
- 多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程
TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...
- C++中的4种类型转换方式
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...
- Django 项目搭建(ubuntu系统)
1 环境搭建 sudo apt-get install python3-pip 安装pip3 sudo pip3 install virtualenv 安装虚拟环境,这里展示virtualenv vi ...
- 读取txt内文件内容
命令如下: f = open("c:\\1.txt","r") lines = f.readlines()#读取全部内容 for line in lines ...
- 电梯调度设计之初感想——蔡迎盈&&曹玉松
突然拿到这个问题,蒙了好久,索性走一步,再走一步好了,希望在这天下第一庄里,会看到晴空. 查了好多资料,终于还是整理出一个很草稿的版本,这只能算是我们初步的设计. 四部电梯载重和乘客限制不同, ...
- poj 3687
Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...
- Scala脚本化-Ammonite
Scala语言定义: Scala combines object-oriented and functional programming in one concise, high-level lang ...
- Javaoop 遇到的问题
一.java 异常的捕获与处理 (免责声明:本博客里所引用的他人博客链接,只用作我个人的学习,同时非常感谢这些作者!) 1. https://blog.csdn.net/wei_zhi/articl ...
- Python:轻量级 ORM 框架 peewee 用法详解(二)——增删改查
说明:peewee 中有很多方法是延时执行的,需要调用 execute() 方法使其执行.下文中不再特意说明这个问题,大家看代码. 本文中代码样例所使用的 Person 模型如下: class Per ...