`
NX
  • 浏览: 12225 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论
  • smartan: 话说这就是所谓的以时间换空间吧
    队列
  • NX: 是的,真心感谢各位提出的意见和建议,我也在修改代码,主要是在怎 ...
    队列
  • xchd: 队列不是先进先出吗?好像没有体现这点。
    队列
  • kidding87: 你这里应该和jdk学习下,动态的容量,怎么去扩容,你这里效率非 ...
    队列

队列

阅读更多
   用数组来存取数据的好处是数据是有序的,便于通过下标对其进行操作。但是数组一旦定义,其长度就是固定的。当用户不知道要存入的数据个数时,用数组就不方便了,因为如果定义长度太大会造成资源的浪费,可如果定义的长度太小又会不能将所有数据存入。因而,需要一个可以动态分配存储空间还可以有序的存放对象的数据结构,队列恰好可以满足上述条件。  
   队列的实现实际也是通过在实现类的内部使用数组保存入队的对象,每次增加新对象时,创建一个比原来数组长度大1的新数组,然后将要加入数据放在新数组的最后一位,再将原数组中的数据放入新数组中,最后让原数组指向新数组的内存地址。
   具体代码如下:
/**
* 定义一个队列类
* @author Administrator
*
*/
public class Queue {
String[] src = new String[0];
/**
  * 实现一个添加元素的方法
  * @param s 是要添加的元素
  */
public void add(String s){
//定义一个新的数组,长度为原数组长度+1
String[] dest = new String[src.length+1];
//将原来数组中的元素依次存入新数组
for(int i=0;i<src.length;i++){
dest[i] = src[i];
}
//将s放入新数组的最后一位
dest[src.length] = s;
//将新数组赋值给原数组
src = dest;
}

/**
* 在下标为i的位置插入s
* @param i
* @param s
*/
public void insert(int i,String s){
//定义一个新的数组,长度为原数组长度+1
String[] dest = new String[src.length+1];
for(int j=0;j<i;j++){
dest[j] = src[j];
}
dest[i] = s;
for(int j=i+1;j<dest.length;j++){
dest[j] = src[j-1];
}
//将新数组赋值给原数组
src = dest;
        }
/**
  * 打印出队列元素
  */
public void print(){
for(int i=0;i<src.length;i++){
String s = src[i];
System.out.println(s);
}
}
/**
* 删除下标为i的元素
* @param i
*/
public void delete(int i){
//定义一个新的数组,长度为原数组长度+1
String[] dest = new String[src.length-1];
for(int j=0;j<i;j++){
dest[j] = src[j];
}
for(int j=i;j<dest.length;j++){
dest[j] = src[j+1];
}
//将新数组赋值给原数组
src = dest;

}


/**
* 查找下标为i的元素
* @param i
* @return
*/
public String get(int i){
String s = src[i];
return s;
}

/**
* 修改下标为i的元素
* @param i
*/
public void modify(int i,String s){
src[i] = s;
}
public int size(){
return src.length;
}
}




import java.util.Scanner;

/**
* 定义一个队列测试类
* @author Administrator
*
*/
public class QueueTest {
      public static void main(String args[]){

Queue qu = new Queue();
//给队列添加元素
for(int i=0;i<10;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++){
    Scanner input = new Scanner(System.in);
             int choose = input.nextInt();
             switch(choose){
        case 1:  qu.insert(3,"插入者");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();
}
}
}



1
0
分享到:
评论
4 楼 smartan 2013-03-24  
话说这就是所谓的以时间换空间吧
3 楼 NX 2013-03-23  
是的,真心感谢各位提出的意见和建议,我也在修改代码,主要是在怎样扩容和实现“泛型”方面。
2 楼 xchd 2013-03-23  
队列不是先进先出吗?好像没有体现这点。
1 楼 kidding87 2013-03-23  
你这里应该和jdk学习下,动态的容量,怎么去扩容,你这里效率非常低,每次add一个就要new一个新的数组这样很浪费

jdk的ArrayList做法是固定的按照比例来扩容 初始容量 加 负载因子 一般容量是2^n次个
然后使用System.arrayCopy来复制数组,这里也很快

还有楼主队列,一般来说,有两种实现,一种是链表 一种是数组
你这个还有待提高

相关推荐

    C语言_初始化队列+入队列+出队列+销毁队列

    ### C语言实现链式队列的基本操作 #### 一、链式队列简介 链式队列是一种基于链表的数据结构,它具有队列的基本特性,即先进先出(FIFO)。与数组实现的队列相比,链式队列能够更灵活地处理数据,特别是在动态变化...

    链队列题目:初始化队列+入队列+出队列+销毁队列

    链队列是一种基于链式结构实现的队列数据结构,其特点是存储空间可以在运行时动态扩展,不局限于预先设定的固定大小。在本题中,我们需要实现四个基本操作:初始化队列、入队列、出队列以及销毁队列。下面将详细讲解...

    C#消息队列,windows使用消息队列,Queue消息队列

    此文档是C#开发的消息队列系统,适用于消息队列入门与新手。 在Windows 7 上安装消息队列的步骤 打开“控制面板”。 单击“程序”,然后在“程序和功能”下, 单击“打开或关闭 Windows 功能”。 -或者-单击“经典...

    队列建立和队列的逆置

    队列是一种特殊的线性数据结构,它遵循“先进先出”(First In First Out, FIFO)的原则。在队列中,元素的添加(入队)发生在队尾,而元素的删除(出队)则总是在队头进行。这种数据结构在计算机科学中有着广泛的...

    WebLogic数据库和消息队列的配置.doc

    WebLogic数据库和消息队列的配置 本文档将详细介绍WebLogic数据库和消息队列的配置方法,主要包括配置数据库连接池和数据源的步骤。 一、配置数据库连接池 在WebLogic中,数据库连接池是通过JDBC(Java Database ...

    循环队列源代码

    循环队列源代码 循环队列是一种数据结构,它通过一个数组或链表来存储元素,并提供了队列操作的接口。队列是一种先进先出的数据结构,元素的添加和删除都是从队头和队尾进行的。在本资源中,我们将探讨循环队列的...

    循环队列 杨辉三角

    循环队列是一种线性数据结构,它通过在队尾出队和队头入队时进行适当的操作,使得队列在物理存储空间上形成一个环形结构。这种设计使得队列在处理大量数据时能有效避免数组下标越界的问题,提高了空间利用率。在...

    java队列实现(顺序队列、链式队列、循环队列)

    在Java中,队列的实现主要有三种:顺序队列、链式队列和循环队列。下面我们将详细探讨这三种队列的实现方式。 1. **顺序队列**: 顺序队列通常是基于数组实现的。在Java中,我们可以使用ArrayList或LinkedList来...

    C#消息队列发送及接收

    在IT行业中,消息队列(Message Queue,MQ)是一种常用于分布式系统中解耦组件、提高系统可扩展性和可靠性的技术。在C#编程中,我们可以利用Microsoft Message Queuing(MSMQ)库来实现消息队列的发送和接收。本文将...

    队列初步介绍,包括循环队列以及迷宫问题等

    ### 队列基础知识与循环队列概念 队列是一种线性数据结构,遵循先进先出(FIFO)原则,即最先加入队列的元素将会最先被移除。队列通常用于多任务处理系统中,比如操作系统的进程调度、打印机队列管理、网络数据包...

    串口缓冲区 循环队列

    循环队列作为一种高效的数据结构,在串口通信的缓冲区管理中扮演着重要角色。这里我们将深入探讨串口缓冲区的概念、循环队列的工作原理以及如何在STM32F103ZET6微控制器上应用这些技术。 串口缓冲区是用于存储串口...

    Android之循环队列操作

    与普通队列不同,循环队列在空间上形成一个环形结构,当队尾达到数组边界时,可以重新回到数组的起始位置,从而避免了满队列时需要创建新队列的问题。这提高了空间利用率并简化了管理过程。 在Java或Android环境中...

    rt-thread队列代码详解

    【rt-thread队列代码详解】 在rt-thread操作系统中,消息队列是一种进程间通信(IPC)机制,允许数据结构在不同任务之间传递。本文将详细解释rt-thread 3.0版本中的消息队列实现。 首先,我们需要理解消息队列的...

    MQ入门实例(本地队列&远程队列 两个例子)

    ### MQ入门实例详解:本地队列与远程队列操作 #### 概述 在消息队列(Message Queue,简称MQ)的学习过程中,理解和掌握本地队列与远程队列的使用是至关重要的。本地队列指的是在同一系统上创建并管理的消息队列,...

    C++数据结构与算法之双缓存队列实现方法详解

    C++数据结构与算法之双缓存队列实现方法详解 本文主要介绍了C++数据结构与算法之双缓存队列实现方法,结合实例形式分析了双缓存队列的原理、实现方法与相关注意事项。 知识点一:双缓存队列的定义 双缓存队列是一...

    Unity3d 队列 方法 Queue

    ### Unity3D中的队列(Queue)方法解析与应用实例 #### 一、概述 在Unity3D开发中,队列是一种非常实用的数据结构,它遵循先进先出(First In First Out, FIFO)的原则,即最先加入队列的元素会最先被移除。队列在...

    C#任务队列的实现

    在C#编程中,任务队列(Task Queue)是一种常用的数据结构,用于管理并发执行的任务。它通过将任务放入队列中,然后由一个或多个工作线程按顺序取出并执行,有效地实现了任务的异步处理和调度。下面将详细讨论如何...

    数据结构队列ADT

    在众多的数据结构中,队列是一种基础且重要的抽象数据类型(ADT,Abstract Data Type)。队列是一种线性数据结构,遵循“先进先出”(FIFO,First In First Out)的原则,类似于现实生活中的排队等待。在本文中,...

    tp5.1消息队列 think-queue

    标题 "tp5.1消息队列 think-queue" 指的是使用ThinkPHP5.1框架集成的消息队列组件——think-queue。消息队列在软件开发中扮演着重要角色,它允许应用程序异步处理耗时任务,提高系统响应速度和整体性能。think-queue...

    循环队列的C++实现

    循环队列是一种线性数据结构,它在物理结构上实现了一个闭合的循环,因此队首和队尾可以在数组的任意位置。这种设计使得在队列满或空时,仍能有效地进行入队和出队操作,避免了普通队列在达到边界条件时的特殊处理。...

Global site tag (gtag.js) - Google Analytics