对队列的个人理解

最近学了队列,但是并不是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)像上面的一样写好自定义的队列

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我理解了你的问题。下面是我给出的解答: ```c++ #include <iostream> #include <cstdlib> #include <ctime> #include "Listr.h" using namespace std; template<typename T> class AgePriorityQueue { public: void enqueue(T data); T dequeue(); bool isEmpty(); int size(); private: Listr<T> list; }; template<typename T> void AgePriorityQueue<T>::enqueue(T data) { if (list.getSize() == 0) { list.push_front(data); } else { typename Listr<T>::iterator it; bool flag = false; for (it = list.begin(); it != list.end(); ++it) { if ((*it)->age > 80) { list.insert_before(it, data); flag = true; break; } } if (!flag) { list.push_back(data); } } } template<typename T> T AgePriorityQueue<T>::dequeue() { if (list.getSize() == 0) { cerr << "Error: queue is empty!" << endl; exit(1); } T temp = list.front(); list.pop_front(); return temp; } template<typename T> bool AgePriorityQueue<T>::isEmpty() { return list.getSize() == 0; } template<typename T> int AgePriorityQueue<T>::size() { return list.getSize(); } struct Person { int age; bool testResult; }; int main() { srand((unsigned)time(NULL)); AgePriorityQueue<Person*> queue; for (int i = 0; i < 3; ++i) { Person* p = new Person; p->age = rand() % 100 + 1; p->testResult = rand() % 2 == 0; queue.enqueue(p); } while (!queue.isEmpty()) { Person* p = queue.dequeue(); cout << "Age: " << p->age << ", Test Result: " << (p->testResult ? "Positive" : "Negative") << endl; delete p; } return 0; } ``` 在该程序中,我们定义了一个 `AgePriorityQueue` 类,其中 `enqueue` 函数将元素按照年龄大小插入队列,年龄大于 80 岁的人排在队首;`dequeue` 函数弹出队首元素,并返回该元素;`isEmpty` 函数判断队列是否为空;`size` 函数返回队列的元素个数。 为了实现这个类,我们用 `Listr` 作为底层容器,并定义了一个 `Person` 结构体表示每个人的年龄和核酸检测结果。在 `main` 函数中,我们随机生成 3 个人的年龄和检测结果,并插入到队列中。然后依次弹出队首元素,并输出其年龄和检测结果。注意在程序结束时,需要释放每个 `Person` 对象的内存空间,以免造成内存泄漏。 希望我的解答能够帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值