`
zhuozhuobeauty
  • 浏览: 18053 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

队列小总结

    博客分类:
  • java
 
阅读更多

队列可以动态分配存储空间还可以有序的存放对象的数据结构,弥补了数组一旦创建就无法改变大小的缺点。下面用代码来说明如何实现队列中的各种操作

/** 
  * 实现一个添加元素的方法 
  * @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语言_初始化队列+入队列+出队列+销毁队列

    #### 四、总结 本篇介绍了如何使用C语言实现链式队列的基本操作,包括初始化队列、入队列、出队列以及销毁队列。链式队列是一种非常实用的数据结构,在实际应用中可以有效地管理动态变化的数据集。通过对这些基本...

    GCD 总结-队列和任务的理解

    GCD的核心概念包括队列和任务,本篇文章将深入探讨这两种核心元素,以及如何在实际项目中运用它们。 ### 1. GCD 的基本概念 GCD 是基于 C 语言的,但在 Objective-C 和 Swift 中都可以使用。它是Apple的系统级并发...

    PI解决队列堵塞问题

    #### 五、总结 通过上述步骤,我们可以有效地解决SAP PI中的队列堵塞问题。重要的是要密切关注队列的状态,并及时采取措施处理堵塞情况,以确保系统的稳定运行。此外,熟悉SMQ2和其他监控工具的功能,能够帮助我们...

    应用题及知识点总结 第四章队列

    应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章队列应用题及知识点总结 第四章...

    优先队列、图等总结及习题.docx

    优先队列、图等总结及习题 优先队列是一种特殊的队列结构,它的出队顺序是根据元素的优先权决定的,而不是元素入队的顺序。优先队列的操作包括查找、插入和删除,删除操作是根据优先权高或低的次序进行的。 一、...

    数据结构实验栈和队列详细实验报告

    【栈和队列的基本概念】 栈是一种特殊的线性表,具有“后进先出”(LIFO,Last In First Out)的特点。栈的主要操作包括入栈(Push)和出栈(Pop)。入栈操作是在栈顶添加元素,而出栈则是删除栈顶元素。栈的应用...

    数据结构 队列部分 队列的删除等相关操作

    总结 在本节中,我们讨论了队列的删除操作,并对其进行了详细的分析。我们了解了队列的基本概念,队列的删除操作,队列的实现,队列的添加操作和队列的遍历操作。通过对队列的理解,我们可以更好地理解和应用队列在...

    串口缓冲区 循环队列

    总结来说,串口缓冲区结合循环队列的设计,为STM32F103ZET6上的串口通信提供了一种高效、可靠的解决方案。通过合理地管理和操作循环队列,可以在保证数据完整性的同时,有效平衡数据的接收和处理速度,提升系统的...

    队列_队列、C语言_

    总结来说,这个项目提供了使用C语言实现队列的实例,包括创建、插入、删除、检查队列状态和销毁队列的全部功能。通过分析这些文件,你可以深入理解C语言中如何手动构建和管理数据结构,这对于学习和理解操作系统、...

    链式队列的基本运算

    链式队列是一种在计算机科学中广泛...- **总结与改进**:总结实验结果,提出可能的优化策略和未来改进的方向。 通过学习和实践这些基本操作,可以深入理解链式队列的原理,并为更复杂的算法和数据结构打下坚实的基础。

    C#消息队列发送及接收

    在IT行业中,消息队列(Message ...总结来说,C#中的MSMQ为开发者提供了一种高效、可靠的异步通信方式。通过理解和掌握消息队列的概念及其在C#中的实现,可以极大地优化你的应用程序架构,提升系统的稳定性和可扩展性。

    tp5.1消息队列 think-queue

    总结,"tp5.1消息队列 think-queue" 是一种在ThinkPHP5.1环境中实现消息队列的方式,通过使用think-queue组件,开发者可以轻松地创建和管理异步任务,提高应用的并发处理能力和系统稳定性。理解其安装、配置、使用...

    队列的基本操作

    #### 五、总结 通过以上分析,我们可以了解到链式队列的基本概念、结构及其实现方法。链式队列相比于顺序队列具有更好的动态扩展能力,适用于需要频繁进行入队和出队操作的应用场景。理解链式队列的基本操作有助于...

    队列的C语言优化实现

    总结,队列的C语言实现可以通过数组或链表结构,结合循环、动态扩展、并发控制等多种策略进行优化。理解这些原理和技巧,可以帮助我们编写更加高效、适应性强的队列数据结构,以满足不同应用场景的需求。

    循环队列的基本操作和实现

    总结,循环队列是一种高效的数据结构,它的基本操作包括初始化、入队、出队以及判断队列状态。理解其工作原理和实现方式对于解决实际问题具有重要意义。在编程实践中,循环队列能够提供稳定、高效的队列操作,是许多...

    C++实现一个队列

    总结来说,C++实现一个队列需要理解数据结构的基础概念,包括队列的工作原理、如何用向量或数组存储元素,以及如何通过指针跟踪队头和队尾。通过自定义队列,我们可以更好地理解和掌握数据结构的核心概念,并在实践...

Global site tag (gtag.js) - Google Analytics