- 链式队列
什么是链式队列?
数据结构的基本问题。队列 是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。一般队列的存储结构是顺序存储,当队列的存储结构是链式存储结构时(即队列中每个元素都包含一个指向其后继的指针,最后一个元素指针为null),就是链式队列,和链栈同理。
链式队列的入队、出队、队头元素的实现;
package ShunXuZhan;
class LinkQueue{
//创建一个内部结点类
class Entry{
int data;
Entry next;
public Entry(){//内部类构造函数初始化
data=-1;
next=null;
}
public Entry(int data){//带参数的内部类构造函数
this.data=data;
this.next=null;
}
}
private Entry front=null;//创建一个 front 域
private Entry rear=null;//创建一个 rear 域
private int usedSize=0;//链式队列有效数据个数
//判断是否为空
public boolean isEmpty(){
return this.usedSize==0;
}
//入队应该用尾插法,方便
public void insertTail(int val){
if(isEmpty()){//如果队是空的话
this.rear=new Entry(val);// new 一个 rear 结点
this.front=this.rear;//将队尾赋值给队头
}else{
this.rear.next=new Entry(val);//队不为空的话,new 一个 rear.next 结点
this.rear=this.rear.next;//rear指向它的下一个结点
}
}
//出队
public void pop(){
if(isEmpty()){//如果队为空
return;
}else{//如果队不为空
Entry cur=this.front;//将 this.front 赋值给 cur
this.front=cur.next;//将 this.front 的下一个结点赋给 this.front 相当于头结点往后移了一位
cur.next=null;//让最初的 front 结点为空
this.usedSize--;//有效长度减一
}
}
//获得栈顶元素
public int getTop(){
if(isEmpty()){//如果队列为空
return -1;
}
return this.front.data;//不为空输出队头元素
}
//打印
public void show(){
Entry cur=this.front;//将 this.front 赋值给 cur
while(cur!=null){//当 cur 不为空时
System.out.println(cur.data+" ");//输出
cur=cur.next;
}
}
}
public class LianShiDuiLie {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkQueue linkqueue=new LinkQueue();
linkqueue.insertTail(10);
linkqueue.insertTail(20);
linkqueue.insertTail(30);
linkqueue.show();
System.out.println("========");
linkqueue.pop();
linkqueue.show();
}
}
- 优先队列:根据优先级进行 插入
package ShunXuZhan;
/*
* 优先级队列:按照优先级进行存储,优先级越高,排在最前面
*
* */
class PrioLink{
class Entry{
int data;
int prio;//优先级
Entry next;
public Entry(){
data=-1;
prio=-1;
next=null;
}
public Entry(int data,int prio){
this.data=data;
this.prio=prio;
this.next=null;
}
}
private Entry head=null;
public PrioLink(){
this.head=new Entry();
}
//插入,按照优先级插入
public void insert(int data,int prio){
Entry entry = new Entry(data,prio);//创造一个结点
Entry cur = this.head;//将 头结点 赋值给 cur
while(cur.next != null){//当头结点不为空
if(cur.next.prio > entry.prio){//如果 某一个结点的优先级大于 entry 的优先级
break;//退出循环
}
cur=cur.next;
}
entry.next=cur.next;//为什么会有空指针呢
cur.next=entry;
}
public void pop(){//删除
Entry cur=this.head;
if(cur.next == null){
return;
}
Entry del=cur.next;//从队头删除
cur.next=del.next;
del=null;
}
public void show(){
Entry cur=this.head.next;
while(cur != null){
System.out.print(cur.data+" ");
cur=cur.next;
}
System.out.println();
}
}
public class YouDuiLie {
public static void main(String[] args) {
// TODO Auto-generated method stub
PrioLink l1=new PrioLink();
l1.insert(10, 6);
l1.insert(6, 2);
l1.insert(2, 5);
l1.show();
}
}
输出:
插入 视图分析:
其余插入同理;
删除: