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)求当前栈最大值 http://blog.csdn.net/ssuchange/article/details/17398007
利用循环队列实现教材P80的舞伴问题。要求:人员的加入并不是一次性完成,可以在过程中加入成员。 1)循环队列的类型定义和基本操作函数声明放在Queue.h文件; 2)基本操作函数及其他函数的实现放在Queue.c或(Queue...
在这个“用消息队列实现的简单聊天程序”中,我们可以探讨以下几个关键知识点: 1. **消息队列的概念**:消息队列是一种存储和转发的机制,它在不同的进程或系统之间作为数据传输的桥梁。当一个进程生成消息时,它...
该C程序使用循环队列实现了N行杨辉三角的输出,实现简单。 使用VC进行编译即可。
在本文中,我们将讨论如何使用循环队列实现AOV网的拓扑排序。循环队列是一种特殊的队列结构,它具有高效的存储和检索能力,可以有效地解决拓扑排序问题。 首先,我们需要对AOV网进行初始化,包括顶点的输入和存储,...
51单片机的FIFO(先入先出)循环队列实现 51单片机是基于Intel 8051微控制器架构的一类单片机,在嵌入式系统开发中应用广泛。FIFO是一种数据结构,全称为First In First Out,即先进先出,类似于现实生活中的排队...
总之,利用队列实现杨辉三角是一种巧妙的方法,它将数据结构的特性与数学问题相结合,展示了计算机科学的魅力。这种方法不仅可以帮助我们理解队列的作用,还能加深对杨辉三角性质的认识,为后续的学习和开发提供启示...
总的来说,C++ Windows版的多生产者多消费者队列实现涉及到了线程同步、互斥量、信号量以及循环数组队列的管理。这种模型广泛应用于多线程编程,尤其是在I/O密集型和计算密集型任务中,有效地提高了系统资源的利用率...
【使用队列实现排队系统】在互联网环境中,队列作为一种重要的数据结构,常被用于模拟和实现各种排队系统。队列遵循先进先出(FIFO)的原则,这使得它非常适合处理请求和服务的顺序,比如在服务器请求处理、任务调度...
### 数据结构:队列实现详解 #### 一、队列概念与特性 在计算机科学领域,**队列**是一种常见的线性数据结构,遵循先进先出(First In First Out, FIFO)的原则。也就是说,最早添加到队列中的元素将是最先被移除的...
用队列实现杨辉三角 队列杨辉三角 c实现杨辉三角 c用队列实现杨辉三角 用队列实现杨辉三角 队列杨辉三角 c实现杨辉三角 c用队列实现杨辉三角
通过以上介绍,我们可以看出,采用消息队列实现客户端与服务端的通信是一种高效、灵活且可靠的解决方案。它能够提升系统的整体性能,同时降低组件间的依赖,为复杂分布式系统的构建提供了强大的支撑。在具体项目中,...
接下来,我们将讨论如何使用队列实现十进制到十六进制的转换。十进制到十六进制的转换通常涉及到取余和进位的过程,这与队列的特性相吻合。我们可以将每个十进制数除以16并取余,然后将余数依次入队。由于16进制中...
用循环队列实现的n阶斐波那契数列的求解。输出最后n-1个不大于max的斐波那契数列。
本文将深入探讨如何利用消息队列这一IPC机制实现进程间的双向通信。消息队列允许进程异步地发送和接收消息,提供了一种高效且灵活的数据交换方式。 消息队列是由内核管理的数据结构,它存储由进程发送的消息,并...
在实际开发中,Java集合框架提供了多种队列实现,如`ArrayDeque`(适用于高性能的随机访问)、`PriorityQueue`(根据元素的自然排序或自定义比较器进行排序)等,可以根据具体需求选择合适的数据结构。此外,Java...
队列实现栈1 队列实现栈是一种数据结构,它使用队列来实现栈的操作。下面是队列实现栈的知识点: 1. 队列实现栈的基本思想: 队列实现栈的基本思想是使用队列来存储数据,然后使用队列的基本操作来实现栈的操作。...
在Java中,队列的实现主要有三种:顺序队列、链式队列和循环队列。下面我们将详细探讨这三种队列的实现方式。 1. **顺序队列**: 顺序队列通常是基于数组实现的。在Java中,我们可以使用ArrayList或LinkedList来...
C++数据结构与算法之双缓存队列实现方法详解 本文主要介绍了C++数据结构与算法之双缓存队列实现方法,结合实例形式分析了双缓存队列的原理、实现方法与相关注意事项。 知识点一:双缓存队列的定义 双缓存队列是一...