今天随手写了一个关于队列的小练习,总觉得不是特别贴切,但一时还没有更好的想法,发出来请大家提意见吧。这是一个模仿队列数据存储方式的停车场小程序,车辆可以入站和出站,参考效果如附件图。
车辆进站时的效果:
车辆出站时的效果:
实现的java源码如下:
package ch3队列;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.*;
public class FinalCar extends JFrame {
int x=10; //图片的横坐标
int y=10; //图片的纵坐标
int width=100; //图片的宽度
int height=120; //图片的高度
Object queue[];
int size=5;
int front=0; //头指针,牺牲一个节点,front及rear均指向此头节点,此节点不存放数据,只用于在代码第97行间接判断队列是否放满
int rear=0; //尾指针
JLabel lblPic=new JLabel(new ImageIcon("car.GIF")); //定义标签数组,存储汽车图片
public FinalCar() {
super();
queue=new Object[5]; //最多放4辆汽车
this.setIconImage(new ImageIcon("/car_icon.GIF").getImage());
setTitle("队列演示");
getContentPane().setLayout(null);
new FlowLayout();
final JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setBounds(10, 10, 461, 143);
panel.setLayout(null);//调整为通过坐标控制的布局形式
final JButton btnIn = new JButton();
//进站
btnIn.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if(isFull())
{
JOptionPane.showMessageDialog(null, "停车场已满,请等待!");
}
else
{
rear=(rear+1)%size;
x=460-rear*(width+5);
queue[rear]=new JLabel(new ImageIcon("car.GIF"));
((Component) queue[rear]).setBounds(x, y, width, height);
panel.add((Component) queue[rear]);
repaint(); //如果是null式布局,则需要repaint
//setVisible(true);//如果是流式布局,setVisible即可显示图片更新
}
}
});
getContentPane().add(panel);
btnIn.setText("进站");
btnIn.setBounds(76, 170, 106, 28);
getContentPane().add(btnIn);
final JButton btnOut = new JButton();
//出站
btnOut.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
JLabel lblPic=null;
if(isEmpty())
{
JOptionPane.showMessageDialog(null, "停车场已空,没有车辆!");
rear=0;
}
else
{
front=(front+1)%size;
lblPic=(JLabel) queue[front];
panel.remove(lblPic); //移除汽车
repaint();
}
}
});
btnOut.setText("出站");
btnOut.setBounds(208, 170, 106, 28);
getContentPane().add(btnOut);
this.setSize(500, 250);
this.setVisible(true);
}
//判断停车场是否已经满了
public boolean isFull()
{
boolean full=true;
if((this.rear+1)%size==front) //停车场满了
{
full=true;
}
else
{
full=false;
}
return full;
}
//判断停车场是否是空的
public boolean isEmpty()
{
boolean empty=true;
if(this.rear==this.front) //停车场已经空了
{
empty=true;
rear=0;
front=0;
}
else
{
empty=false;
}
return empty;
}
public static void main(String[] args) {
FinalCar frame=new FinalCar();
}
}
其实对最终的演示效果不太满意,但在界面的表现上来说实在不想花更多的时间,只希望能基本表现出队列的一些使用方法,请大家多提意见。
- 大小: 20.7 KB
- 大小: 17.7 KB
分享到:
相关推荐
例如,操作系统中的进程调度就是基于优先级队列实现的,新进程被添加到队尾,而运行的进程完成后,下一个进程从队头开始执行。 栈和队列的操作可以使用数组或链表来实现。数组实现简单但有容量限制,当元素数量超过...
这个例子中的“入队列出队列练习.vi”就是一个交互式的实例,通过可视化的方式演示了如何添加元素到队列(入队)以及如何取出元素(出队)。 首先,我们需要创建一个队列。在LabVIEW中,可以使用“创建队列”函数来...
本篇我们将探讨如何利用两个栈来模拟一个队列,这是数据结构与算法中的一个经典问题。 标题“两个栈实现一个队列”暗示了我们要用到栈的特性来构建一个具有队列行为的数据结构。通常,栈支持两种基本操作:push...
- **入队(EnQueue)**: 在队列尾部添加一个数据元素。 - **出队(DeQueue)**: 移除并返回队列头部的数据元素。 - **判断队列是否为空**: 检查队列中是否有数据元素。 #### 3. 队列的应用示例 在这段代码中,队列被...
利用队列的性质完成括号匹配的功能。假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或 [([ ] [ ])]等为正确格式,[( ])或(((]均为不正确的格式。检验括号是否匹配的方法可用...
2. 删除:找到要删除的节点,更新其前一个节点的指针以指向后一个节点。 3. 查找:遍历链表直到找到目标节点或到达链表末尾。 4. 修改:定位到目标节点并更新其数据域。 接下来,我们讨论队列。队列是一种先进先出...
本练习是关于实现一个基于C++的FIFO队列模板类,利用模板类可以使得该队列适用于任何数据类型。下面我们将详细讨论这个主题。 **FIFO队列的概念** FIFO队列是一种线性数据结构,其操作特性类似于现实生活中的排队。...
2. 大根堆:使用`priority_queue,vector,less<int>>`来声明,其中`less<int>`是另一个函数对象,它让优先队列按照从大到小的顺序排列元素。与小根堆类似,插入、访问和移除元素的方法与小根堆相同。 在文件中还提到...
队列练习.doc
13. 数组 Q[n]用来表示一个循环队列,f 为当前队列头元素的前一位置,r 为队尾元素的位置,假定队列中元素的个数小于 n,计算队列中元素的公式为 (n+f-r)% n。 14. 设有 4 个数据元素 a1,a2,a3 和 a4,对他们分别...
[Java]算法练习-双栈队列练习题
在此过程中,教师可以通过穿插小游戏来吸引学生的注意力,使得队列练习更加生动有趣。例如,可以组织“集中注”游戏,让学生在游戏中练习集中注意力,反应要快。同时,教师要注意及时纠正学生在练习中出现的错误,...
在实际生活中,银行排队系统就是一个典型的队列应用实例。 PPT中可能会详细讲解以下内容: 1. 栈的基本操作:Push(入栈),Pop(出栈),Peek(查看栈顶元素但不移除),以及Stack的初始化和判断空栈的方法。 2. ...
在本题中,我们关注的是如何使用C++来实现一个队列,其中队列的成员变量是一个顺序表。顺序表是数据结构中的基本形式,它将元素存储在一块连续的内存区域中,通过数组实现。下面我们将详细讨论C++中顺序表作为队列...
在判断一个字符串是否为回文时,栈和队列可以发挥重要作用。 首先,我们来了解一下栈(Stack)和队列(Queue)。栈是一种后进先出(Last In, First Out, LIFO)的数据结构,就像一个堆叠的盘子,新添加的盘子总是在...
1. 初始化:创建一个空队列,通常包括分配内存空间以存储队列元素。 2. 入队:在队尾添加元素,通常会检查队列是否已满,以防止溢出。 3. 出队:从队头移除并返回元素,确保队列的FIFO特性。 4. 查看队头元素:不...
1. 分解练习:以口令“向左(右)转——走,一、二、三”或“向后转——走,一、二、三”进行,分别在每个步骤中完成特定动作,如“一”时只移动脚步,“二”时转体,“三”时迈步。 2. 原地踏步练习:在原地踏步...
优先队列、图等总结及习题 优先队列是一种特殊的队列结构,它的出队顺序是根据元素的优先权...1. 归并排序-优先队列练习 2. 由邻接矩阵画出相应的图 G 3. 使用深度优先搜索和宽度优先搜索遍历无向图 4. 求最小生成树
下面我们将详细讨论如何在C#中实现一个简单的队列类,并创建一个测试类来验证其功能。 首先,我们定义了一个名为`Node`的内部类,用于表示队列中的每个元素。这个类包含三个成员: 1. `data`:存储节点的值,类型...