队列既可以用数组来实现也可以用链表来实现:
1.数组实现思路:
首先想好其中的各种方法,比如添加,删除,获取长度,获得指定位置的元素啦。。。
然后定义一个数组(可以是0长度的,比较简单);
然后每次添加删除的时候就重新定义新长度的数组就好了;
然后就是按照对应位置赋好值就行了,比较简单。
新写的代码,比较简单:
//定义数组实现的队列
public class ArrayList{
public static void main(String [] args){
ArrayList al=new ArrayList();
Stuent stu=new Student();
stu.name="lili";
stu.score=100;
stu.sex="F";
Stuent stu1=new Student();
stu1.name="lilei";
stu1.score=10;
stu1.sex="M";
al.add(stu1);
system.out.println("al长度为"+al.size);
al.delete(1);
system.out.println("al长度为"+al.size);
}
Student[] stu=new Student[0];
//实现功能将stu添加到数组的末尾
public void add(Student stun){
Student[] stu1=new Student[stu.length+1];
for(int i=0;i<stu.length;i++){
stu1[i]=stu[i];
}
stu1[stu.length]=stun;
stu=stu1;
}
//实现功能删除某个位置的元素
public void delele(int index){
Student[] stu2=new Student[stu.length-1];
for(int i=0;i<stu.length-1;i++){
if(i<index){stu2[i]=stu[i];}
else{stu2[i]=stu[i+1];}
}
stu=stu2;
}
//实现获取队列长度的方法
public int size(){
return stu.length;}
}
相关类Student:
public class Student{
public String name;
public int score;
public String sex;
}
2.然后是关于链表实现的队列
在每个节点里要定义自己存储的信息和下一个节点,然后按照我的经验和教训啊,写链表类的时候要把根节点什 么的定义为全局的,下面就可以直接调用啦,这样比较简单,我犯的错误就是把add方法里面的那个中间变量定义在了方法 里面,每次调用都会重新创建,本来应该用上一次的地址去指向下一个的,就变成了每次创建新节点指向下一个,就报空 指针, 其余就都是一些小问题了。
直接上代码:
public class LinkList{
LinkNode root;
LinkNode last;
LinkNode temp = null;
public void add(LinkNode ln){
if(root==null){
root=ln;
temp=root;
System.out.println("root为"+temp.data);
}
else{
last=ln;
temp.next=last;
temp=last;
System.out.println("下一个为"+last.data);
}
}
public void delete(int index){
LinkNode parent=root;
LinkNode lNode=root;
int count=0;
while(count<index-1){
parent=parent.next;
count++;
}
int coun=0;
while(coun!=index){
lNode=lNode.next;
coun++;
}
parent.next=lNode.next;
}
public int length(){
int count=0;
LinkNode temp;
temp=root;
while(temp!=null){
temp=temp.next;
count++;
}
return count;
}
public static void main(String [] args){
LinkNode lNode=new LinkNode();
lNode.data="abacccc";
LinkNode lNode1=new LinkNode();
lNode1.data="mqh";
LinkList ll=new LinkList();
ll.add(lNode);
System.out.println("长度为"+ll.length());
ll.add(lNode1);
System.out.println("长度为"+ll.length());
ll.delete(1);
System.out.println("长度为"+ll.length());
}
}
关于节点类LinkNode的定义:
public class LinkNode{
public Object data;
public LinkNode next;
}
3.区别:1思路不同,一个是数组,一个是链表,所以两个的写法也不同,数组占连续的内存所以不需要考虑到下一个指向问 题,而链表可以不占连续的内存,所以要考虑下一个的指向问题,这也是侧重点;
2.两个侧重不同,数组取出其中的数据比较方便,只要直接去array[i]即可,而链表就必须遍历了,这个比较麻烦;
数组增删比较麻烦,要把其中每个数据都取出重新放入新数组,而链表就比较方便只需改变前后两个节点的指向 即可。
4.夜已深,一首小词送给大家:
临江仙 梦后楼台高锁
北宋 晏几道