队列(第一次修改)

     之前关于队列的代码实在是有很多地方应该改善,在此再次对热心帮我指出缺点的朋友表示感谢,不过我感觉如果用数组实现队列扩容还是得每次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();
}
}
}

猜你喜欢

转载自939647516.iteye.com/blog/1835655
今日推荐