之前关于队列的代码实在是有很多地方应该改善,在此再次对热心帮我指出缺点的朋友表示感谢,不过我感觉如果用数组实现队列扩容还是得每次new一个新的数组,所以那部分只是修改了将原数组中数据复制到新数组中的方法。下面是我修改后的代码。
package com20130323;
/**
* 定义一个队列类
* @author Administrator
*
*/
public class ModifyQueue {
//系统自定义初始长度为100,每次扩容5
private int len = 100;
private int increase = 10;
//count用来记录当前数组中最后一个元素的下标
int count = 0;
String[] src ;
/**
* 重载构造函数,用户自定义队列的初始长度和每次扩容的长度
* @param len 队列初始长度
* @param increase 每次扩容增加的长度
*/
public ModifyQueue(int len,int increase){
this.len = len;
this.increase = increase;
src = new String[len];
}
/**
* 用户无法提供初始长度和每次增加的值时,使用默认参数
*/
public ModifyQueue(){
this(100,10);
}
/**
* 实现添加元素的方法
* @param s 是要添加的元素
*/
public void add(String s){
//先判断数组是否需要扩容
if(count<src.length&&src[count]==null){
src[count] = s;
count++;
}
else{
//定义一个新的数组,长度为原数组长度+1
String[] dest = new String[src.length+increase];
//将原来数组中的元素依次存入新数组
System.arraycopy(src, 0, dest, 0, src.length);
//将新数组赋值给原数组
src = dest;
src[count] = s;
count++;
}
}
/**
* 打印出队列非空元素
*/
public void print(){
for(int i=0;i<src.length;i++){
if(src[i]!=null){
String s = src[i];
System.out.println(s);
}
}
}
/**
* 删除下标为i的元素
* @param i
*/
public void delete(int i){
//定义一个新的数组,长度为原数组长度+1
String[] dest = new String[src.length-1];
System.arraycopy(src,0,dest,0,i);
System.arraycopy(src,i+1,dest,i,dest.length-i);
//将新数组赋值给原数组
src = dest;
}
/**
* 查找下标为i的元素
* @param i 要查找元素的下标
* @return 返回下标为i的元素
*/
public String get(int i){
String s = src[i];
return s;
}
/**
* 修改下标为i的元素
* @param i 要修改的元素的下标
*/
public void modify(int i,String s){
src[i] = s;
}
/**
* 得到队列长度的方法
* @return 返回队列的长度
*/
public int size(){
return src.length;
}
}
package com20130323;
import java.util.Scanner;
import com20130317.Queue;
/**
* 定义一个队列测试类
* @author Administrator
*
*/
public class Test {
public static void main(String args[]){
ModifyQueue qu ;
System.out.println("请输入要创建队列初始长度和扩容大小:");
System.out.println("当您输入0 0时系统将采用默认参数");
Scanner input = new Scanner(System.in);
int len = input.nextInt();
int increase = input.nextInt();
if(len!=0&&increase!=0){
qu = new ModifyQueue(len,increase);
}
else{
qu = new ModifyQueue();
//初始创建10个元素,便于后面对ModifyQueue中方法的测试
len = 10;
}
for(int i=0;i<len;i++){
qu.add("姓名"+i);
}
qu.print();
System.out.println("输入1执行的是增加操作");
System.out.println("输入2执行的是删除操作");
System.out.println("输入3执行的是找操作");
System.out.println("输入4执行的是改操作");
System.out.println("请输入:");
for(int i=0;i<4;i++){
int choose = input.nextInt();
switch(choose){
case 1: qu.add("增加的");break;
case 2: System.out.println("请输入要删除元素位置:");
int n = input.nextInt();
qu.delete(n); break;
case 3: System.out.println("请输入要查找元素位置:");
int m = input.nextInt();
String s =qu.get(m); System.out.println(s);return;
case 4: qu.modify(1,"被改了");break;
default : System.out.println("请输入1至4");
}
qu.print();
System.out.println();
}
}
}
分享到:
相关推荐
队列是一种先进先出(FIFO)的数据结构,也就是说,第一个进入队列的元素也将是第一个离开队列的。在动画场景中,这可以用来确保动画步骤按预定的顺序执行。 在JavaScript中,我们可以使用数组来模拟队列,通过push...
环队列是一种特殊的数据结构,它的最后一个元素连接到第一个元素,以形成一个环形结构。在本例中,我们使用环队列来模拟银行叫号服务,实现客户叫号和服务台服务的模拟演示。 首先,我们需要定义环队列的结构体 ...
通过将请求暂时存储在消息队列中,系统可以根据自身处理能力逐渐取出并处理这些请求,而不是一次性全部处理。这样不仅可以避免系统因为瞬间的高峰负载而崩溃,还可以有效地利用系统的处理能力,平滑地处理请求,提高...
1. **Stackpush()---1-200**:这表示进行了第一次入栈操作,从编号1至200的元素依次入栈。 2. **Stackpop()---1-100**:紧接着进行出栈操作,从编号200开始逐个出栈,直至编号101。 3. **pop:200...pop:101**:这一...
FreeRTOS笔记1创建工程和消息队列的使用 ...LED第一秒闪烁1次,第二秒闪烁3次,第三秒闪烁5次,如此循环,消息队列测试通过。 本文详细介绍了如何使用Cubermx创建工程和消息队列,以及如何使用FreeRTOS实时操作系统。
`a` 初始化为1,表示队列的第一个可用位置;`b` 初始化为1,表示队列的初始尾部位置。队列的存储使用了一个动态数组 `que`,长度为1000005,足够容纳大量操作。 #### 基本操作实现 - **push(x)**:在 `que` 的下一...
,n 一次性全部进栈,再进行输出,所以p1=n,p2=n-1,?,pi=n-i+1。 (3)选择题:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上 MAXSIZE(本题为 n)...
- **批量操作**:在条件允许的情况下,一次处理多个元素,减少CAS操作的次数。 - **线程局部存储**:每个线程维护自己的部分队列,减少全局队列的竞争。 总结来说,自扩充的Lock-Free并发环形队列算法通过锁无关的...
"第一次上机作业.zip" 这个标题暗示了这是一个包含初次上机实践练习内容的压缩文件。通常,这样的作业可能来自于计算机科学或信息技术相关的课程,旨在帮助初学者熟悉编程环境、基本操作或者特定编程语言的使用。 ...
在这个例子中,我们观察到消息有几次重试,每次重试之间有一个等待时间,例如第一次等待10秒,第二次等待2秒,第三次等待4秒。这种重试策略可以通过配置文件进行调整,包括最大重试次数和每次重试之间的延迟时间。 ...
5. **消息批量处理**:消息队列可以支持一次性处理多个消息,提高效率。 6. **顺序保证**:某些消息队列可以保证消息的顺序性,确保消息按照特定顺序处理。 7. **消息确认与重试机制**:消息队列可以提供消息确认...
1. 队列头:记录队列的第一个元素的位置。 2. 队列尾:记录队列的最后一个元素之后的位置。 3. 队列容量:预先设定的最大元素数量,用于限制队列大小。 4. 元素数组:存储队列中的实际数据。 根据描述,这个Queue...
Vue会缓存同一事件循环中发生的所有数据变更,如果同一个watcher被多次触发,只有第一次触发会加入到队列中,这样做可以去除重复的数据更新,从而避免不必要的计算和DOM操作。 在下一个事件循环(通常称为“tick”...
在“第一次考试编程答案”这个主题中,我们可以推测这可能是一个学习编程的初学者正在准备或回顾他们的编程基础知识测试。下面,我们将深入探讨一些可能涉及的重要编程知识点: 1. **基础语法**:无论是哪种编程...
并改正错误,提示:只有一行程序有错误,所以只能修改代码中的某一行程序。要求演示在eclipse开发环境下 单步调试程序,如果没有eclipse开发环境,也可以使用其它集成开发环境,但是必须演示调试能力。 2. ...
### 和EVA的第一次亲密接触:HP EVA阵列配置详解 #### HP EVA阵列简介 HP EVA(Enterprise Virtual Array)系列磁盘阵列是HP存储产品线中的重要组成部分,位于VA与XP系列之间,主要面向企业级存储需求。EVA系列支持...
在"第一次上机实验_数据结构算法_源码.zip"这个压缩包中,我们很可能找到了一系列与数据结构和算法相关的编程源代码,用于帮助初学者实践和理解这些概念。 首先,让我们探讨一下数据结构。数据结构是组织和存储数据...
业务需求 ...2、redis 过滤(就是只处理当天第一次请求) 3、redis 辅助存储app名称(验证过后批量插入数据app名称表中) 4、拼接插入的以及新增的如详细表中 解决办法: 1、接口修改 redis 过滤 + 如l
本篇文章将详细解析一个以C++为编程语言,利用面向对象思想构建的学生平均成绩管理系统,该系统实现了基本的增、删、改、查功能,是HHU(假设的大学名称)数据结构课程的第一次实验作业。通过这个项目,我们可以深入...