1.什么是队列?
队列也叫队,时允许在一段进行擦汗如另一端进行删除的运算受限的线性表。区别队列和栈:栈时先进后出,队列时先进先出。
2.顺序队列
队列的顺序储存结构称为顺序队列,可以做到不浪费地址空间
顺序队列使用front和rear两个指针分别指向队头元素和队尾元素的位置
入队出队的演示:
顺序队列的特点:
- 静态分配储存空间
- 入队操作只能在队尾,出队操作只能在队首
- 队列为空时front=rear
- 队列为满时,rear=队列的长度-1
- 队列非空非满时 front<rear<队列的长度-1
选A
3.链式队列(重点)
队列的链式存储结构称为链式队列
链式队列的特点:
- 动态分配存储空间
- 入队操作在队尾进行,出队操作在队头进行
- 链式队列在入队时无队满的问题
- 链式队列为空队列的条件:front=rear
4.java代码实现链式队列
底层使用WxLinkList实现,WxLinkList是由我自己实现的一个线性表的链式储存,队列也是在线性表的链式存储的基础上来的,但是这里我修复了一个线性表的链式存储的删除元素的bug,之前没有考虑到删除头节点的问题,所以我把修改后的删除方法贴出来
/*
指定删除一个元素
*/
@Override
public void remove(T elementm) {
Node node=new Node(elementm,null);
//历遍,判断是否相等
Node current=header;
Node prenode=null; //要删除节点的上一个
for (int i=0;i<size&¤t!=null;i++,prenode=current,current=current.next)
{
if (node.getNodevalue().equals(current.getNodevalue()))
{
//如果删除的时头节点,prenode会为null;所以在这里需要判断,队列在这里透视需要弹出top的元素
//当队列中只有一个元素的时候current.next;会为null
if(i==0&&size>1)
{
//当前节点的下一个节点为头节点
Node next = current.next;
header=next;
size--;
}
else if (i==0&&size==1)
{
clear();
}
else {
Node nextnode=current.next; //要删除节点的下一个节点
prenode.next=nextnode; //当前节点的指针域指向下一个节点就删除了当前的节点
size--;
}
}
}
}
接下来回到队列上来,老规矩,首先实现队列的基本操作接口:
package com.wx.datastructure.base;
public interface WxQueue {
/*
链式队列的接口
*/
public boolean isEmpty();//判断队列是否为空
public int size(); //返回队列的大小
public void push(Object element); //将元素由队尾压入队列
public Object pop(); //弹出队首的元素
public Object peek(); //查找队首的元素
}
然后实现接口的方法:
package com.wx.datastructure.imp;
import com.wx.datastructure.base.WxQueue;
import java.util.NoSuchElementException;
public class WxQueueImp implements WxQueue {
/*
实现队列的接口方法
*/
private WxLinkList linkList=null;
public WxQueueImp()
{
linkList=new WxLinkList();
}
/*
判断队列是否为空
*/
@Override
public boolean isEmpty() {
return linkList.isEmpty();
}
/*
返回队列的大小
*/
@Override
public int size() {
return linkList.size();
}
/*
从队尾压入元素
*/
@Override
public void push(Object element) {
linkList.addLast(element);
}
/*
弹出队首元素
*/
@Override
public Object pop() {
if (linkList.isEmpty())
{
throw new NoSuchElementException("队列为空");
}
Object o = linkList.get(0);
linkList.remove(o);
return o;
}
@Override
public Object peek() {
if (linkList.isEmpty())
{
throw new NoSuchElementException("队列为空");
}
return linkList.get(0);
}
}
测试:
package com.wx.datastructure.test;
import com.wx.datastructure.base.WxQueue;
import com.wx.datastructure.imp.WxQueueImp;
import java.util.Scanner;
public class TestWxQueue {
/*
测试WxQueue
*/
public static void main (String[] args)
{
WxQueue wxQueue=new WxQueueImp();
Scanner input =new Scanner(System.in);
System.out.print("输入压入队列的元素,输入quit表示离开:");
String element=input.next();
while (!element.equals("quit"))
{
wxQueue.push(element);
element=input.next();
}
while (!wxQueue.isEmpty())
{
System.out.print(" ");
System.out.print(wxQueue.pop());
}
}
}
测试的结果,果然是先进先出的序列:
至于队列的线性存储的实现,底层可以选用我写的线性表的顺序存储然后参照本篇博客来实现
不说了,本篇博客代码地址:https://github.com/WangAlainDelon/DataStructure4.git