`
csb
  • 浏览: 4234 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

队列实现

    博客分类:
  • java
阅读更多
1.概念的小小理解
      参考解释:队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
       我们当然不能照搬概念,这只会混淆我们的视听。我的理解队列就是一个简单的拥有一个长串(这就是所谓的一种数据结构)的事物,长串里面可是各种各样的对象(数据类型),好像我们排队打水的时候那一长串的人一样,这一长串就是队列,队列的实体就是我们人(就是队列中存放的对象)。再举一个例子,小时候顽皮在地上玩泥巴经常看见的小蚂蚁搬食物,那长长的蚂蚁队伍也是一个队列,蚂蚁就是队列的实体对象。我既然聊到的队列的概念,那就肯定就会思考说明概念有什么作用,没有实际操作的东西永远的都没有价值,所以,我不会花这么大的气力说一些没有作用的东西。首先我们引进队列是因为它有一个可爱的优点,那就是队列没有长度的限制,不想数组那样机械,在使用之前就必须申请空间大小。所以我们用的时候考虑到应该能够给队列添加元素,那就有add()方法,同时要能够知道队列的大小,那就是size()方法,同时我们如果要取到队列中的某一元素的话那就应该有get()方法,以及要插入某一位置,删除某一位置的元素,就必须要有各种方法,自己视需要而写。综述一下,队列是一个不限定长度的数据结构,中间可以是任意类型的元素,引进的作用是方便操作


2.数组的队列实现
以学生数组为代表
     
 public class STList {
	//实例化一个学生对象数组
	private Student[] scrA=new Student[0];
	
	public void add(Student st) {
		Student[] destA=new Student[scrA.length+1];
		destA[scrA.length]=st;
		for(int t=0;t<scrA.length;t++){
			destA[t]=scrA[t];
		}
		scrA=destA;
	}

	public Student get(int index) {
		Student st=scrA[index];
		return st;
	}

	public int size() {
		return scrA.length;
	}
      //.....更多的方法
}




3.链表的队列实现

public class MyNode {
	public Object obj;
	public MyNode next;
	
	public MyNode(Object obj){
		this.obj=obj;
	}
	
	public void setObject(Object obj){
		this.obj=obj;
	}
	
	public Object getObject(){
		return obj;
	}
	
	public void setNext(MyNode next){
		this.next=next;
	}
	
	public MyNode getNext(){
		return next;
	}
}

public class TestMyQueue {

	/**队列的测试类
	 * @param args
	 */
	public MyNode root=null;
	public static void main(String[] args) {
		TestMyQueue tm=new TestMyQueue();
		tm.add("aa");
		tm.add("bb");
		tm.add("cc");
		for(int i=0;i<tm.length();i++){
			System.out.println(tm.getIndexobj(i));
		}
		tm.insertIndexobj(1,"dd");
		for(int i=0;i<tm.length();i++){
			
			System.out.println(tm.getIndexobj(i));
		}
		Object obj=tm.removeIndexobj(3);
		System.out.println(obj);
		for(int i=0;i<tm.length();i++){
			
			System.out.println(tm.getIndexobj(i));
		}
	}
	
	public void add(Object obj){
		MyNode node=new MyNode(obj);
		if(root==null){
			root=node;
		}else{
			MyNode tem=root;
			
			while(tem!=null && tem.next !=null){
				tem=tem.next;
			}
			tem.next=node;
		}
	}
	
	public int length(){
		int i=0;
		MyNode tem=root;
		while(tem!=null){
			tem=tem.next;
			i++;
		}
		return i;
	}
	
	public void insertIndexobj(int index,Object obj){
		MyNode node=new MyNode(obj);
		MyNode tem=root;
		MyNode node1=root;
		int j=this.length();
		if(index>j){
			System.out.println("请输入长度小于队列长度的数");
		}else{
			int k=0;
			while(k!=index){
				node1=tem;
				tem=tem.next;
				k++;
			}
			node1.next=node;
			node.next=tem;
		}
	}
	
	public Object getIndexobj(int index){
		int i=0;
		int len=this.length();
		MyNode tem=root;
		if(index>len){
			System.out.println("越界!!");
		}else {
		while(i!=index){
			tem=tem.next;
			i++;
		}
		}
		Object obj=tem.getObject();
		return obj;
	}
	
	public Object removeIndexobj(int index){
		int i=0;
		int len=this.length();
		MyNode tem=root;
		MyNode tem1=root;
		
		if(index>len){
			System.out.println("越界!!");
		}else {
		while(i!=index){
			tem1=tem;
			tem=tem.next;
			i++;
		}
		tem1.next=tem.next;
		}
		Object obj=tem.getObject();
		return obj;
	}
}




4.通用队列实现以及队列的优化
<1>通用队列的实现
public class MyList<E> {
	//实例化一个String数组
	private Object[] sa=new Object[0];
	
	//add方法
	public void add(E node){
		Object[] ms=new  Object[sa.length+1];
		for(int i=0;i<sa.length;i++){
			ms[i]=sa[i];
		}
		ms[sa.length]=node;
		sa=ms;
	} 
	
	//get方法
	public  E get(int index){
		E node=<E>sa[index];
		return node;
	}
	
	//返回长度
	public int size(){
		return sa.length;
	}
//......其他的方法
}

<2>队列的优化
在加入元素时,每加一个就会把原来的数组重新复制到新的数组,时间效率很低
public void add(E node){
		Object[] ms=new  Object[sa.length+1];
		for(int i=0;i<sa.length;i++){
			ms[i]=sa[i];
		}
		ms[sa.length]=node;
		sa=ms;
	} 

//改进
Object[] ms=new  Object[sa.length+1000];//增加更长的长度,效率明显提高

打一个比方:我每天都有一个习惯就是早晨会喝一杯牛奶,但是我的做法是每天早晨都要跑一趟超市去买,花的时间太多,如果我一次买一箱的话,花的时间就会少太多



      5.队列实现重绘
   
 public void paint(Graphics g){
		super.paint(g);
		int count=50;
		//画棋盘
		for(int j=0;j<11;j++){
			g.drawLine(200,200+j*50,700,200+j*50);
		}
		for(int k=0;k<11;k++){
			g.drawLine(200+k*50,200,200+k*50,700);
		}
		int size=pointlist.size();
		for(int i=0;i<size;i++){
			Point po=pointlist.get(i);
			g.fillOval(po.x,po.y,30,30);
		}
	}


在鼠标监听器里面要有返回的队列
public PointList getPointList(){
		return pointlist;
	}

分享到:
评论

相关推荐

    用单链表和队列实现归并排序

    在标题“用单链表和队列实现归并排序”中,我们可以理解到这个实现是利用了链表和队列的数据结构。链表是一种线性数据结构,其中的元素在内存中不是顺序存储的,而是通过指针链接。队列则是一种先进先出(FIFO)的...

    栈和队列操作:栈实现、队列实现、双栈实现队列、双队列实现栈、栈实现O(n)求当前栈最大值

    栈实现 队列实现 双栈实现队列 双队列实现栈 栈实现O(n)求当前栈最大值 http://blog.csdn.net/ssuchange/article/details/17398007

    舞伴问题(采用队列实现)

    利用循环队列实现教材P80的舞伴问题。要求:人员的加入并不是一次性完成,可以在过程中加入成员。 1)循环队列的类型定义和基本操作函数声明放在Queue.h文件; 2)基本操作函数及其他函数的实现放在Queue.c或(Queue...

    用消息队列实现的简单聊天程序

    在这个“用消息队列实现的简单聊天程序”中,我们可以探讨以下几个关键知识点: 1. **消息队列的概念**:消息队列是一种存储和转发的机制,它在不同的进程或系统之间作为数据传输的桥梁。当一个进程生成消息时,它...

    循环队列实现杨辉三角

    该C程序使用循环队列实现了N行杨辉三角的输出,实现简单。 使用VC进行编译即可。

    利用循环队列实现AOV 网的拓扑排序

    在本文中,我们将讨论如何使用循环队列实现AOV网的拓扑排序。循环队列是一种特殊的队列结构,它具有高效的存储和检索能力,可以有效地解决拓扑排序问题。 首先,我们需要对AOV网进行初始化,包括顶点的输入和存储,...

    51单片机的FIFO(先入先出)循环队列实现

    51单片机的FIFO(先入先出)循环队列实现 51单片机是基于Intel 8051微控制器架构的一类单片机,在嵌入式系统开发中应用广泛。FIFO是一种数据结构,全称为First In First Out,即先进先出,类似于现实生活中的排队...

    队列实现杨辉三角

    总之,利用队列实现杨辉三角是一种巧妙的方法,它将数据结构的特性与数学问题相结合,展示了计算机科学的魅力。这种方法不仅可以帮助我们理解队列的作用,还能加深对杨辉三角性质的认识,为后续的学习和开发提供启示...

    C++ windows版 多生产者多消费者的队列实现

    总的来说,C++ Windows版的多生产者多消费者队列实现涉及到了线程同步、互斥量、信号量以及循环数组队列的管理。这种模型广泛应用于多线程编程,尤其是在I/O密集型和计算密集型任务中,有效地提高了系统资源的利用率...

    使用队列实现排队系统.pdf

    【使用队列实现排队系统】在互联网环境中,队列作为一种重要的数据结构,常被用于模拟和实现各种排队系统。队列遵循先进先出(FIFO)的原则,这使得它非常适合处理请求和服务的顺序,比如在服务器请求处理、任务调度...

    数据结构 队列实现 数据结构 队列实现

    ### 数据结构:队列实现详解 #### 一、队列概念与特性 在计算机科学领域,**队列**是一种常见的线性数据结构,遵循先进先出(First In First Out, FIFO)的原则。也就是说,最早添加到队列中的元素将是最先被移除的...

    【数据结构】C用队列实现杨辉三角

    用队列实现杨辉三角 队列杨辉三角 c实现杨辉三角 c用队列实现杨辉三角 用队列实现杨辉三角 队列杨辉三角 c实现杨辉三角 c用队列实现杨辉三角

    采用消息队列实现客户端与服务端的通信

    通过以上介绍,我们可以看出,采用消息队列实现客户端与服务端的通信是一种高效、灵活且可靠的解决方案。它能够提升系统的整体性能,同时降低组件间的依赖,为复杂分布式系统的构建提供了强大的支撑。在具体项目中,...

    【源代码】C++算法(四)队列的基本操作 (用队列实现十进制转换十六进制)

    接下来,我们将讨论如何使用队列实现十进制到十六进制的转换。十进制到十六进制的转换通常涉及到取余和进位的过程,这与队列的特性相吻合。我们可以将每个十进制数除以16并取余,然后将余数依次入队。由于16进制中...

    循环队列实现斐波那契数列

    用循环队列实现的n阶斐波那契数列的求解。输出最后n-1个不大于max的斐波那契数列。

    linux使用消息队列实现进程间双向通信

    本文将深入探讨如何利用消息队列这一IPC机制实现进程间的双向通信。消息队列允许进程异步地发送和接收消息,提供了一种高效且灵活的数据交换方式。 消息队列是由内核管理的数据结构,它存储由进程发送的消息,并...

    java 队列实现

    在实际开发中,Java集合框架提供了多种队列实现,如`ArrayDeque`(适用于高性能的随机访问)、`PriorityQueue`(根据元素的自然排序或自定义比较器进行排序)等,可以根据具体需求选择合适的数据结构。此外,Java...

    队列实现栈1

    队列实现栈1 队列实现栈是一种数据结构,它使用队列来实现栈的操作。下面是队列实现栈的知识点: 1. 队列实现栈的基本思想: 队列实现栈的基本思想是使用队列来存储数据,然后使用队列的基本操作来实现栈的操作。...

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

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

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

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

Global site tag (gtag.js) - Google Analytics