队列可以动态分配存储空间还可以有序的存放对象的数据结构,弥补了数组一旦创建就无法改变大小的缺点。下面用代码来说明如何实现队列中的各种操作
/**
* 实现一个添加元素的方法
* @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;
}
}
下面用实现画图板重绘的练习详细说明
实现队列的父类~E为泛型,可以被不同类型的变量使用~
package Duilie; /** * 自定义队列的接口 * * @author XiongXiangJun * */ public interface CustomList<E> { public void add(E e); // public void add(String str,int index); public int size(); // public boolean delete(int index); // // public boolean delete(String str); // // public boolean update(String str,int index); public E get(int index); }
继承父类CustomList(),用于实现队列的添加,删除等功能,目前还完善。。。搞了一天泡泡堂的人伤不起。。。~没有时间好好弄一下画板了~只能先擦除的方法写好,还没能实现呢~~~
package Duilie; /** * 定义自定义队列的实现类,该类实现CustomList * @author XiongXiangJun * */ public class CustomListImpl<E> implements CustomList<E> { //定义一个数组,数组的长度为0 private Object [] array; //定义一个size,表示数组中元素的总数 private int size = 0; /** * 构造方法 */ public CustomListImpl(){ array = new Object[0]; } /** * 构造方法 * @param 初始队列的长度为length */ public CustomListImpl(int length){ array = new Object[length]; } /** * 添加元素的方法 * @param e要被添加到队列中的元素 */ public void add(E e) { //创建一个新的数组,长度是原始数组的长度+1 Object [] tempArray = new Object[array.length+1]; //将原始数组array中存储的值赋给tempArray for(int i=0;i<array.length;i++){ tempArray[i] = array[i]; } //将stu的值添加到tempArray数组的末尾 tempArray[array.length] = e; //数组的总数加1 size++; //将tempArray数组名中存储的地址赋给array数组 array = tempArray; } /** * 删除元素的方法 * @param e要被删除的队列中的元素 */ public void delete(E e) { //创建一个新的数组,长度是原始数组的长度-1 Object [] tempArray = new Object[array.length-1]; //将原始数组array中存储的值赋给tempArray int I = 0; for(int i=0;i<array.length;i++){ if (array[i] ==e ){ I = i; } } for(int i=0;i<array.length-1;i++){ if(i<I){ tempArray[i] = array[i];} else { tempArray[i] = array[i+1]; } } //数组的总数减1 size--; //将tempArray数组名中存储的地址赋给array数组 array = tempArray; } /** * 获取队列中元素的总数 * @return 返回size的值,0表示没有元素 * */ public int size() { return size; } /** * 获取指定索引位置的元素 * @param index指定的索引位 * @return index的索引位如果小于0或者大于数组的总数则返回null, * 否则返回index索引位置的元素值 */ public E get(int index) { //判断index的值是否在范围中 if(index < 0 || index > size-1) return null; return (E)array[index]; } }
画板监听器类
package Duilie; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import Duilie.CustomListImpl;; public class DrawListener implements MouseListener { // 声明绘制图形的对象 private Graphics2D g; // 鼠标按下的坐标值 private int x1, y1, x2, y2; // 图形 private DrawBorder db; // 定义一个标志位,表示用来绘制三角形的第一条边和后两条边的变量 private boolean state = true; private int startX, startY, endX, endY; private CustomList<Shape> cl; private Shape shape; /** * 构造方法 * * @param g绘制图形的对象 */ public DrawListener(Graphics g, DrawBorder db,CustomList<Shape> cl) { this.g = (Graphics2D) g; this.db = db; this.cl = cl; } /** * 在事件源上发生鼠标单击操作的时候执行该方法 */ public void mouseClicked(MouseEvent e) { if (db.getShapeType().equals("Triang")) { if (!state) { x2 = e.getX(); y2 = e.getY(); // 绘制三角形的剩余的两条边 //g.drawLine(x2, y2, startX, startY); // 实例化一个绘制直线的方法 shape = new ShapeLine(x2, y2, startX, startY, Color.BLACK, 1); // 调用绘制图形的方法 shape.draw(g); //g.drawLine(x2, y2, endX, endY); cl.add(shape); // 实例化一个绘制直线的方法 shape = new ShapeLine(x2, y2, endX, endY, Color.BLACK, 1); // 调用绘制图形的方法 shape.draw(g); cl.add(shape); // 修改state标志位的值 state = true; } } } /** * 在事件源上发生鼠标按下操作的时候执行该方法 */ public void mousePressed(MouseEvent e) { // 获取鼠标按下时的坐标值 x1 = e.getX(); y1 = e.getY(); } /** * 在事件源上发生鼠标释放操作的时候执行该方法 */ public void mouseReleased(MouseEvent e) { // 获取鼠标释放时的坐标值 x2 = e.getX(); y2 = e.getY(); if (db.getShapeType().equals("Line")) { // 实例化一个绘制直线的方法 shape = new ShapeLine(x1, y1, x2, y2, Color.BLACK, 1); // 调用绘制图形的方法 shape.draw(g); cl.add(shape); } else if (db.getShapeType().equals("Rect")) { // 实例化一个绘制矩形的方法 shape = new ShapeRect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2), Color.BLACK, 1); // 调用绘制图形的方法 shape.draw(g); cl.add(shape); } else if (db.getShapeType().equals("Triang")) { if (state) { // 实例化一个绘制直线的方法 shape = new ShapeLine(x1, y1, x2, y2, Color.BLACK, 1); // 调用绘制图形的方法 shape.draw(g); cl.add(shape); // 将x1,y1,x2,y2的值存储到中间变量 startX = x1; startY = y1; endX = x2; endY = y2; // 改变标志位的值 state = false; } } else if(db.getShapeType().equals("RoundRect")){ shape = new ShapeRoundRect(Math.min(x1, x2), Math.min(y1, y2), Math.max(x1 , x2), Math.max(y1 , y2),Color.BLACK, 1); shape.draw(g); cl.add(shape); } else if(db.getShapeType().equals("Oval")){ shape = new ShapeOval(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 -y2),Color.BLACK, 1); shape.draw(g); cl.add(shape); } } /** * 鼠标移动到事件源上时执行该方法 只执行一次 */ public void mouseEntered(MouseEvent e) { } /** * 鼠标离开到事件源上时执行该方法 只执行一次 */ public void mouseExited(MouseEvent e) { } }
具体画图的类,以矩形的为例,其余都想死,唯有圆角矩形的稍微有一点区别
package Duilie; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; /** * 绘制矩形的类 * * */ public class ShapeRect extends Shape { /** * 构造方法 */ public ShapeRect(int x1, int y1, int x2, int y2, Color color, int stroke) { super(x1, y1, x2, y2, color, stroke); } /** * 绘制图形的方法 */ public void draw(Graphics2D g) { g.setStroke(new BasicStroke(getStroke()));//设置线条粗细 g.setColor(getColor());//设置线条颜色 g.drawRect(getX1(), getY1(), getX2(), getY2()); } }
最后,我发现学的东西越来越有用了~那个五子棋神马的一移动棋子就没有了,如果用队列,就能在最大化,最小化之后仍显示原来下好的棋子,可以尝试使用一下~~~
相关推荐
循环队列是一种线性数据结构,它在计算机科学中被广泛应用于数据缓存、消息队列等场景。相比于传统的队列,循环队列利用数组的循环特性,避免了队列满或空时需要重新分配内存的问题,提高了空间利用率和操作效率。在...
数据结构中的队列是一种线性数据结构,遵循先进先出(First In First Out,FIFO)的原则,即最先进入队列的元素将是最先被处理的。与栈不同,队列允许在一端(通常称为队尾)进行元素的插入,在另一端(通常称为队头...
本篇文章将对几种常见的队列进行深入的总结和探讨。 首先,我们来看最基本的**线性队列**,也称为顺序队列。线性队列在内存中通常是通过数组实现的,它的入队操作在队尾进行,出队操作在队头进行。当队列满时,可以...
#### 四、总结 本篇介绍了如何使用C语言实现链式队列的基本操作,包括初始化队列、入队列、出队列以及销毁队列。链式队列是一种非常实用的数据结构,在实际应用中可以有效地管理动态变化的数据集。通过对这些基本...
GCD的核心概念包括队列和任务,本篇文章将深入探讨这两种核心元素,以及如何在实际项目中运用它们。 ### 1. GCD 的基本概念 GCD 是基于 C 语言的,但在 Objective-C 和 Swift 中都可以使用。它是Apple的系统级并发...
#### 五、总结 通过上述步骤,我们可以有效地解决SAP PI中的队列堵塞问题。重要的是要密切关注队列的状态,并及时采取措施处理堵塞情况,以确保系统的稳定运行。此外,熟悉SMQ2和其他监控工具的功能,能够帮助我们...
应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章...
优先队列、图等总结及习题 优先队列是一种特殊的队列结构,它的出队顺序是根据元素的优先权决定的,而不是元素入队的顺序。优先队列的操作包括查找、插入和删除,删除操作是根据优先权高或低的次序进行的。 一、...
【栈和队列的基本概念】 栈是一种特殊的线性表,具有“后进先出”(LIFO,Last In First Out)的特点。栈的主要操作包括入栈(Push)和出栈(Pop)。入栈操作是在栈顶添加元素,而出栈则是删除栈顶元素。栈的应用...
总结 在本节中,我们讨论了队列的删除操作,并对其进行了详细的分析。我们了解了队列的基本概念,队列的删除操作,队列的实现,队列的添加操作和队列的遍历操作。通过对队列的理解,我们可以更好地理解和应用队列在...
总结来说,串口缓冲区结合循环队列的设计,为STM32F103ZET6上的串口通信提供了一种高效、可靠的解决方案。通过合理地管理和操作循环队列,可以在保证数据完整性的同时,有效平衡数据的接收和处理速度,提升系统的...
总结来说,这个项目提供了使用C语言实现队列的实例,包括创建、插入、删除、检查队列状态和销毁队列的全部功能。通过分析这些文件,你可以深入理解C语言中如何手动构建和管理数据结构,这对于学习和理解操作系统、...
链式队列是一种在计算机科学中广泛...- **总结与改进**:总结实验结果,提出可能的优化策略和未来改进的方向。 通过学习和实践这些基本操作,可以深入理解链式队列的原理,并为更复杂的算法和数据结构打下坚实的基础。
在IT行业中,消息队列(Message ...总结来说,C#中的MSMQ为开发者提供了一种高效、可靠的异步通信方式。通过理解和掌握消息队列的概念及其在C#中的实现,可以极大地优化你的应用程序架构,提升系统的稳定性和可扩展性。
总结,"tp5.1消息队列 think-queue" 是一种在ThinkPHP5.1环境中实现消息队列的方式,通过使用think-queue组件,开发者可以轻松地创建和管理异步任务,提高应用的并发处理能力和系统稳定性。理解其安装、配置、使用...
#### 五、总结 通过以上分析,我们可以了解到链式队列的基本概念、结构及其实现方法。链式队列相比于顺序队列具有更好的动态扩展能力,适用于需要频繁进行入队和出队操作的应用场景。理解链式队列的基本操作有助于...
总结,队列的C语言实现可以通过数组或链表结构,结合循环、动态扩展、并发控制等多种策略进行优化。理解这些原理和技巧,可以帮助我们编写更加高效、适应性强的队列数据结构,以满足不同应用场景的需求。
总结,循环队列是一种高效的数据结构,它的基本操作包括初始化、入队、出队以及判断队列状态。理解其工作原理和实现方式对于解决实际问题具有重要意义。在编程实践中,循环队列能够提供稳定、高效的队列操作,是许多...
总结来说,C++实现一个队列需要理解数据结构的基础概念,包括队列的工作原理、如何用向量或数组存储元素,以及如何通过指针跟踪队头和队尾。通过自定义队列,我们可以更好地理解和掌握数据结构的核心概念,并在实践...