题目描述
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
顺序队列:建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。在入队、出队过程中,可能需要频繁移动数据。
循环队列:在实际使用队列时,为了使队列空间能重复使用,减少数据移动次数,对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1时超出了所分配的队列空间,就让它指向这片连续空间的起始位置(可以使用取余运算rear%MaxSize和front%MaxSize实现,MaxSize表示数组容量)。这实际上把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列称为循环队列。
使用面向对象的思想实现循环队列,队列中的元素存放在数组中。其主要功能为:
(1)数据元素入队 (2)数据元素出队 (3)队列是否为空
(4)队列是否为满 (5)查询数据元素是否在队列中 (6)返回队列中元素个数
某学校安排学生与教师做健康体检活动,学生的属性包括学号、姓名等,方法包括带参构造方法,返回学生信息字符串的方法(返回学号与姓名,之间用英文逗号分隔)。教师的属性包括职工号、姓名、家庭住址等,方法包括带参构造方法,返回教师信息字符串的方法(返回职工号、姓名与家庭住址,之间用英文逗号分隔)。这两个类在设计时要求用继承的思想进行设计。
在主类中,定义队列对象存储排队中的学生与教师信息。输入一个整数表示队列能容纳的最大人数。按输入选项完成相应操作:0-结束程序,1-排队等待体检,2-体检完成出队,3-按照姓名查找某个人,4-输出队列中人员数。选项为1时(排队),输入a表示学生,b表示教师,并输入相应的完整信息,若队列未满,则该人入队,否则输出“queue is full,operation failed”;选项为2时,若队列未空,则应输出出队的人员信息,否则输出“queue is empty,operation failed”;选项为3时,输入姓名,输出队列中相应的人员信息,一个人员信息独立成行,若查询不到信息则输出“no found”。
输入
队列最大容量,选项及其对应的输入信息
输出
相应信息
样例输入 Copy
3
1
a x001 aa
1
b j001 aa 15-1-101
1
a x002 bb
4
3
aa
1
b j002 cc 12-2-201
3
cc
2
0
样例输出 Copy
3
x001,aa
j001,aa,15-1-101
queue is full,operation failed
no found
x001,aa
提示
提示:在使用Java语言编写实现循环队列时,一般可以使用两种方式判断队列是否已满(任选其一):
(1)增加一个属性size用来记录目前的元素个数。当front=rear时,size=0表示队列为空,size=数组长度表示队列已满。
(2)数组中只存储“数组大小-1”个元素,保证rear转一圈之后不会和front相等,也就是队列满的时候,rear+1=front,中间刚好空一个元素。
package myself;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int maxsize;
int size=0;
int rear=0,front=0;//只需要在主函数里就行了,不需要将它传到其他类中,类比数组,做这些只是i值,而不是要在数组里的
Student[] peo=new Student[100];
maxsize=reader.nextInt();
while(true) {
int m=reader.nextInt();
if(m==0) break;
else if(m==1) {//入队
String c=reader.next();//java。scanner中没有char的输入,所以char只能通过转换string来输入
if(c.charAt(0)=='a') {//输入学生信息
if(size+1<=maxsize) {//不超过最大值
if(rear==0) {//被除数不能为0
peo[0]=new Student(reader.next(),reader.next());
}
else {
peo[rear%maxsize]=new Student(reader.next(),reader.next());
}
rear++;
size ++;
}
else System.out.println("queue is full,operation failed");
}
else {//输入老师信息
if(size+1<=maxsize) {//不超过最大值
if(rear==0) {
peo[0]=new Teacher(reader.next(),reader.next(), reader.next());
}
else peo[rear%maxsize]=new Teacher(reader.next(),reader.next(), reader.next());
rear++;
size ++;
}
else System.out.println("queue is full,operation failed");
}
} else if (m==2) {//出队
if(size>0) {//不为空,-----出队
if(front==0) { peo[0].show();
}
else peo[front%maxsize].show(); front++; size--;
}
else System.out.println("queue is empty,operation failed");
}
else if(m==3)
{//查找
String name=reader.next();
int flag=0;
if(size>0) {//不为空
for(int i=front%maxsize;i<=rear%maxsize;i++) {
if(name.equals(peo[i].name)) {
peo[i].show();
flag=1; //break;
}
}
} if(flag==0) {
System.out.println("no found");
}
}
else if(m==4) {//输出元素个数
System.out.println(size);
}
}
}
}
//现在我有一个问题,就是调用super()之后所有的属性和方法都继承了,还是调用super(参数列表)
//不对super是用来初始化的,不调用法初始化,但是继承是存在的;
//class People { //
// int size=0,maxsize;
// int front=0,rear=0;
//因为这几个元素不用输入,所以不用在构造函数里初始化
//// String sno,name;
//// People(String sno,String name,int name){
//// this.name=name;
//// this.sno =sno;
//// }
// int getsize(int size) {
// this.size=size;
// return size;
// }
//
//
//}
class Student {
String sno,name;
Student(String sno,String name){
this.name=name;
this.sno =sno;
}
void show() {
System.out.println(sno+","+name);
}
}
class Teacher extends Student{
String address;
Teacher(String sno, String name,String address) {
super(sno, name);
this.address=address;
}
void show() {
System.out.println(sno+","+name+","+address);
}
}
我感觉我写的怪好的,但是怎么连输都输不出来啊,好吧,实际上我连队列都搞不明白,哪个好人能帮我改改代码啊,要在我的代码基础上改,不要用到异常处理,我来没学到呢