`

对队列的个人理解

阅读更多

最近学了队列,但是并不是Queue,而是自定义队列.
自定义队列的步骤是:
1.定义一个接口,将需要的方法写好放在里面

/*
 * 自定义队列的接口
 */
public interface ArrayList<E> {

	public void add(E e);//向队列中添加E
	
	public int size();//队列的大小
	
	public 	E get(int index);//得到指定索引的E
	
}

 
2.创建一个类并继承那个接口,然后将方法按照需要的用途写出来

public class ArrayListUse<E> implements ArrayList<E>{

	//定义一个数组,数组的长度为0
	private Object array[];
	//定义size,表示数组的长度
	private int size;
	
	//构造方法
	public ArrayListUse(){
		array = new Object[0];
	}
	
	//构造方法
	public ArrayListUse(int length){
		array = new Object[length];
	}
	
	//添加元素的方法
	public void add(Object e) {
		//定义一个数组,用来存放要加的元素
		Object[] temparray = new Object[array.length+1];
		//将原来的数组存入这个数组中
		for(int i=0;i<array.length;i++){
			temparray[i]=array[i];
		}
		//将要添加的e存入temparray数组中
		temparray[array.length]=e;
		//指原数组的新长度
		size++;
		//将array指向添加元素进去的数组的地址
		array=temparray;
	}


	//获取指定位置元素的方法
	public E get(int index) {
		return (E)array[index];
	}

	//获取数组长度的方法
	public int size() {
		return size;
	}

}

 
3.在需要用到队列的主类里面使用即可

 

于是,做了个小练习,使用队列实现画板的重绘

(共写了5个类,用来实现画板的重绘)

  (1)主类:

package 队列;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

//定义一个画板类
public class DrawBorder extends JFrame{
	//程序的入口主函数
	public static void main(String [] args){
		//实例化一个画板类对象
		DrawBorder bd = new DrawBorder();
		bd.initUI();//方法
		
	}
	
	//定义一个全局变量存储图形的属性
	private String shapeType = "Line";
	
	public String getShapeType() {
		return shapeType;
	}
	
	//实例化一个队列
	ArrayListUse<Draw> array = new ArrayListUse<Draw>();

	public void initUI(){
		//设置窗体属性
		this.setSize(800,600);//大小
		this.setLocationRelativeTo(null);//设置居中
		this.setResizable(false);//设置不可改变窗体大小
		this.setDefaultCloseOperation(3);//设置窗体关闭时退出程序
		
		
		JPanel eastJP = new JPanel();//实例化一个北边面板
		eastJP.setPreferredSize(new Dimension(120,0));
		
		//给窗体设置一个菜单
		JMenuBar jmb = new JMenuBar();
//		jmb.setPreferredSize(new Dimension(0,20));
		JMenu menu = new JMenu("菜单");
		JMenuItem save = new JMenuItem("保存");
		menu.add(save);
		JMenuItem open = new JMenuItem("打开");
		menu.add(open);
		jmb.add(menu);
		this.add(jmb,BorderLayout.SOUTH);
		
		
		
		
		//给窗体添加按钮
		JButton butLine = new JButton("直线");
		JButton butRect = new JButton("矩形");
		JButton butOval = new JButton("椭圆形");
		JButton butRoundRect = new JButton("圆角矩形");
		JButton butTrian = new JButton("等腰三角形");
		JButton butTriangel = new JButton("任意三角形");
		
		eastJP.add(butLine);
		eastJP.add(butRect);
		eastJP.add(butOval);
		eastJP.add(butRoundRect);
		eastJP.add(butTrian);
		eastJP.add(butTriangel);
		
		//使用匿名内部类处理
		ActionListener ac = new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				shapeType = e.getActionCommand();
				System.out.println("你点击了"+shapeType+"按钮!");
			}
		};
		
		//将监听器加到按钮上
		butLine.addActionListener(ac);
		butRect.addActionListener(ac);
		butOval.addActionListener(ac);
		butRoundRect.addActionListener(ac);
		butTrian.addActionListener(ac);
		butTriangel.addActionListener(ac);
				
		this.add(eastJP,BorderLayout.EAST);//将此面板添加到窗体上
		
		//创建一个画图的面板
		JPanel drawPanel = new JPanel();
		drawPanel.setBackground(Color.white);
		this.add(drawPanel,BorderLayout.CENTER);
		
		this.setVisible(true);//设置窗体可见
		
		//在窗体可见之后获取画板
		Graphics g = drawPanel.getGraphics();
		
		//创建绘制图形的处理类
		DrawListener dl = new DrawListener(g,this,drawPanel,array);
		drawPanel.addMouseListener(dl);
		//实例化一个菜单处理类
		FileOperation fo = new FileOperation(array,g);
		//给菜单加上监听器
		save.addActionListener(fo);
		open.addActionListener(fo);
		
	}
	

	//重绘的方法
	public void paint(Graphics g){
		super.paint(g);  
	    for (int i = 0; i < array.size(); i++) {  
	    	// 将队列中的图形画出来  
	    	 (array.get(i)).draw(g);  
	    }
	
	
	
	}
}

 (2)创建一个事件处理类,用来监听鼠标的行为

 (3)创建一个画图类,里面实现画板的功能

public class Draw /*implements drawKind*/{

	private int x1,y1,x2,y2;
//	private Graphics g;
	String shapeType;
	
	//构造方法
	public Draw(int x1,int y1,int x2,int y2,String shapeType){
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
//		this.g = g;
		this.shapeType = shapeType;
	}
	
	//画图的方法
	public void draw(Graphics g){
		if(shapeType.equals("直线")){
			drawline(g);
		}else if(shapeType.equals("矩形")){
			drawrect(g);
		}else if(shapeType.equals("椭圆形")){
			drawoval(g);
		}else if(shapeType.equals("圆角矩形")){
			drawroundrect(g);
		}else if(shapeType.equals("等腰三角形")){
			drawtrian(g);
		}
	}
	
	//画直线的方法
	public void drawline(Graphics g) {
		g.drawLine(x1, y1, x2, y2);
	}

	//画椭圆的方法
	public void drawoval(Graphics g) {
		g.drawOval(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
	}

	//画矩形的方法
	public void drawrect(Graphics g) {
		g.drawRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
	}

	//画圆角矩形的方法
	public void drawroundrect(Graphics g) {
		g.drawRoundRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2), 30, 30);
	}

	//画等腰三角形的方法
	public void drawtrian(Graphics g) {
		 Graphics2D g2d = (Graphics2D) g;          
		 GeneralPath path = new GeneralPath();   
		 path.moveTo(x1, y1);           
		 path.lineTo(x2, y2);           
		 path.lineTo(2*x1-x2, y2);      
		 path.moveTo(2*x1-x2, y2);
		 path.lineTo(x1, y1);
		 g2d.draw(path);
	}
	
	public int getX1() {
		return x1;
	}

	public int getY1() {
		return y1;
	}

	public int getX2() {
		return x2;
	}

	public int getY2() {
		return y2;
	}

	public String getShapeType() {
		return shapeType;
	}

}

  (4)像上面的一样写好自定义的队列

 

实现画板重绘就是在事件处理类里面将鼠标选择需要的功能而画出的图存入队列中,然后在主类里面将队列里面的图取出来.这样便实现了画板的重绘.

1
2
分享到:
评论

相关推荐

    PHP PDO和消息队列的个人理解与应用实例分析

    本文实例讲述了PHP PDO和消息队列的个人理解与应用。分享给大家供大家参考,具体如下: 什么是消息队列,百度百科说,···消息队列····是在消息的传输过程中保存消息的容器。 看着网上林林总总的文章,都说是...

    约瑟夫生死游戏队列实现

    约瑟夫生死游戏,也被称为约瑟夫环问题(Josephus Problem),是计算机科学和算法设计中的一个经典问题。...通过对这个问题的深入理解和实现,我们可以更好地掌握数据结构与算法,提升编程解决问题的能力。

    数据结构c++,队列,舞伴配对

    从提供的压缩包文件名"Wuban"来看,可能是对“舞伴”或者“舞步”的简称,但具体含义需要更多上下文才能确定。不过,结合标题和描述,我们可以推断它可能包含了一个实现上述配对逻辑的C++程序或相关资源。 总的来说...

    北京工业大学 数据结构与算法 (电控学院) 第四章栈和队列作业

    北京工业大学,电控学院,《数据结构与算法》。本资源是北工大电控学院大一下学期课程《数据结构与...本代码为上传者原创,仅供个人学习参考使用,请勿自行在其他网站及论坛发布,作者在此对访问本资源的同学表示感谢。

    队列操作的验证及应用

    2、实验目的:加深理解循环队列的定义;掌握顺序循环队列的表示与实现。 3、实验内容: 设有N个人站成一排,从左到右的编号分别为1——N,现在从左往右报数“1,2,3,1,2,3。。。”,数到1的人出列,数到2和3的人...

    优先队列实验报告

    优先队列是一种特殊的数据结构,它允许我们根据元素的优先级进行操作,通常用于处理具有紧急程度的任务。在这个实验报告中,优先队列是通过最大堆...这样的实践有助于深化对堆和优先队列的理解,并锻炼了问题解决能力。

    顺序循环队列的应用举例

    顺序循环队列是一种在计算机科学中常见的数据结构,它在实际应用中有着广泛的作用。...通过对队列的操作,我们可以高效地解决这个经典问题,理解并掌握这一算法有助于提升我们在面对类似问题时的解决能力。

    一种通用队列的实现

    在这个场景中,我们讨论的是一种特别设计的通用队列实现,由个人编写,适用于8-32位单片机系统,其地址空间为16-32位。这个简洁的队列实现使用了C语言中的指针来高效地处理数据。 首先,C语言是编程的基础,它的...

    用C#队列解决跳舞排队问题

    在编程领域,尤其是在设计算法和数据结构时,经常会遇到各种有趣的实际问题,"用C#队列解决跳舞排队问题"就是一个典型的例子。...理解并掌握队列的原理和操作,对于提升编程能力及解决复杂问题具有重要意义。

    Go-系统V消息队列的一个人Go封装

    本话题主要聚焦于一个个人开发者对系统V消息队列的Go语言封装,这使得Go开发者能够更加便捷地利用这种底层通信机制。 系统V消息队列是Unix/Linux操作系统提供的一种进程间通信(IPC)方式,允许不同进程之间通过...

    将消息写入消息队列

    实践项目如“将指令写入队列”可以帮助你更好地理解和掌握这些概念,逐步成为一个熟练的消息队列使用者。在实际操作中,你可以从创建简单的示例开始,然后逐渐增加复杂度,比如处理错误、实现消息确认机制等。

    数据结构——车厢重排——队列问题

    通过解决类似的问题,学生可以更好地理解和掌握队列的概念及其应用方法。 #### 总结 本文介绍了基于链式队列实现的“车厢重排”问题。通过详细的代码分析,我们了解了队列的基本操作,如初始化、销毁、入队和出队等...

    经典数据结构队列的研究和实现.pdf

    事实上,掌握好队列的原理,可以加深我们对先进先出机制在不同应用中如何发挥作用的理解,从而更好地设计和优化软件系统。 总结而言,队列作为数据结构中的基础,其重要性不言而喻。它在理论学习和实际应用中都有着...

    循环队列求解约瑟夫环问题.zip

    约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古希腊的数学家约瑟夫所提出。...通过深入理解和实践,不仅可以掌握约瑟夫环问题的解决方案,还能对C语言和数据结构有更深入的理解。

    数据结构实验三(循环队列基本操作)题目和源程序

    本实验旨在通过实际编程任务加深学生对于循环队列的理解及其在解决具体问题中的应用能力。实验主要包括两个部分: 1. **循环队列基本操作**:包括构造循环队列、清空队列、向队列插入新元素、返回队头元素以及删除...

    栈和队列课件(可以上课使用)

    栈和队列是数据结构中的两种基础且重要的抽象数据类型,它们在计算机科学和软件开发中扮演着不可或缺的角色。...为了适应个人需求,您可以根据实际教学或学习情况对课件内容进行适当的修改和调整。

    【实验报告】 线性数据结构的实现与应用_双端队列_逆波兰式_呼叫中心_XAUAT_(原问题自杜克大学C++ Stacks and Queues and List

    通过实际编程,加深对双端队列特性的理解,如其在头部和尾部进行插入和删除操作的灵活性。同时,将双端队列应用于逆波兰表达式求值和呼叫中心的离散事件模拟,以展示其在不同场景下的功能和优势。 二. 实验要求、...

    java-消息队列Rabbit各种模式测试用例

    本测试用例集主要涵盖了RabbitMQ的各种工作模式,旨在帮助个人深入理解和学习如何在Java环境中使用RabbitMQ。 1. **简单模式(Simple)** 在简单模式中,生产者发送消息到交换机,交换机根据预定义的路由键将消息...

    posix消息队列与system_v消息队列

    ### Posix消息队列与System V消息队列详解 ...总之,Posix和System V消息队列都有各自的优势,选择哪种实现取决于具体的应用场景和个人需求。理解它们之间的差异有助于更好地设计和实现高效稳定的多进程通信系统。

Global site tag (gtag.js) - Google Analytics