以下代码实现都是基于的超级数组进行实现的。
超级数组的相关代码在最后面,如果对数组特别了解的小伙伴可以忽略不看。
下面进入正题:
首先引入取票器代码:
public class BankTicket {
//设置一个变量对队列进行填充
private int startNumber = 100;
//设置公用的Scanner方法
private Scanner scanner = new Scanner(System.in);
//实例化队列
private Queue queue = new Queue();
//程序入口
public void inputName(){
//先对队列进行填充
for (int i = 1;i< startNumber;i++) queue.add(i);
//循环执行
while (true){
System.out.println("请你输入您的名字:");
String name= scanner.next();
//进到取票方法
Integer ticket = getTicket();
System.out.println("尊敬的[" +name+ "],您的号码是:"+ ticket +".");
}
}
//取票方法
private Integer getTicket(){
//首先进行判空
if(queue.isEmpty()){
System.out.println("号码已经全部取完了,需要继续释放号码!");
System.out.println("请输入号码的个数:");
Integer number = scanner.nextInt();
pushTicket(number);
}
return queue.pop();
}
//增加队列的容量
public void pushTicket(int ticketNumber){
for (int i = 0; i < ticketNumber; i++) {
startNumber ++;
queue.add(startNumber);
}
}
}
运用oop思想对以上代码进行封装。想要执行它可以直接在这个class中创建main方法,或者新建
一个方法类代码如下:
public class Client {
public static void main(String[] args) {
BankTicket bankTicket = new BankTicket();
bankTicket.inputName();
}
}
取票器中使用到的队列代码。
public class Queue {
SuperArray superArray = new SuperArray();
//入队
public void add(int data){
superArray.addToTail(data);
}
//出队
public int pop(){
Integer select = superArray.select(0);
superArray.delete( 0);
return select;
}
//判空
public boolean isEmpty(){
return superArray.size() == 0;
}
//返回队头
public int peek(){
return superArray.select(0);
}
}
最后是取票器的核心部分:
超级数组的实现
/*
超级数组
*/
public class SuperArray {
//搞一个能存放data的数组
private int[] element;
//下标,维护当前存储的位置,数组里面的位置下标
private int currentIndex = -1;
// index也是下标,用于查找当前数组位置的下标,与currentIndex的
//作用不同,currentIndex是指向当前数组最后一个位置
//Index是随机找到当前的下标对应的data---element[Index]
// data 为数据
//使用构造器初始化
public SuperArray(){
this(10);
}
//重载构造器
public SuperArray(int capacity){
element = new int[capacity];
}
//对数据的增删改查
//增加一个元素,尾插
public void add(int index,int data){
//游标向前走
currentIndex ++;
//如果超出数组的边界就进行扩容
if(currentIndex > element.length - 2){
int [] temp = new int[element.length*2];
for (int i= 0; i <element.length ; i++) {
temp[i] = element[i];
}
element = temp;
}
//移动位置,腾出空间
for (int i = currentIndex; i >= index; i--) {
element[i+1] = element[i];
}
element[index] = data;
}
//尾插性能对比 10w数据 头插 1286ms 尾插 3ms
//头插需要挪动整个数组,数据过多时每次空间复杂度为O(n),时间复杂度为O(1)
//而尾插则不需要挪动位置,空间复杂度O(1),根据下标可以直接找到对应位置,时间复杂度也为O(1)
//头插
public void addToHeader(int data) {
this.add(0, data);
}
//尾插
public void addToTail(int data) {
this.add(currentIndex + 1, data);
}
//删除一个元素
public void delete(int index){
//边界判断
if(index < 0 || index >element.length - 1){
System.out.println("您删除的下标"+index+"不在范围之内!");
}else {
for (int i = index + 1; i <element.length ; i++) {
element[i - 1] = element[i];
}
currentIndex --;
}
}
//修改一个元素
public void set(int index,int data){
//越界判断
if(index < 0 || index >element.length-1){
System.out.println("您修改的下标"+index+"不在范围之内!");
}else {
element[index] = data;
}
}
//查询下标为data的元素
public Integer select(int index) {
if (index < 0 || index > element.length - 1) {
System.out.println("您查找的下标" + index + "不在范围之内!");
return null;
} else {
return element[index];
}
}
//获取数组长度
public int size(){
return currentIndex+1;
}
//把数组变成字符串,tostring方法
public String arrayToString(){
String result = "[";
for (int i = 0; i <= currentIndex; i++) {
result += element[i]+",";
}
return result.substring(0,result.length()-1) + "]";
}
//手撸的冒泡排序,学个方法,论效果真不如 .sort()
public void sort(){
for (int i = 0; i < currentIndex; i++) {
for (int j = 0; j < currentIndex - i; j++) {
if(element[j] > element[j+1]){
int temp = element[j];
element[j] = element[j+1];
element[j+1] = temp;
}
}
}
}
}