数据结构——链队列

数据结构——链队列

一、队列的基本概念?

队列是一种限定存取位置的线性表。它只允许在表的一端插入,在另一端删除。因此,从数据类型的角度来看,队列是一种独立的抽象数据类型。允许插入的一端叫做队尾,允许删除的一端叫做队头。

每次在队尾加入元素,因此入队的顺序为a1,a2,a3,…,an,最先入队的元素最先出队,所以队列具有的这种特性成为先进先出FIFO(First In First Out)
注意数据元素可以是各种类型,但必须属于同一种数据元素类。

二、使用步骤

1.队列的接口定义

public interface Queue {
	public void clear();
	public int length();//返回链队列的长度
	public boolean full();//判断是否为满
	public boolean empty();//判断是否为空
	public boolean enque(Object el);//入队
	public Object dlque();//出队
	public Object getfront();//返回队列的头元素
	

}

2.创建节点类

public class Node {
	Object data;
	Node next ;
	
	
	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
	}

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}

	public Node(Object data,Node next ) {
		
		this.next = next;
		this.data = data;
	}

	public Node() {
		this(null,null);
	}
	

}

3.创建LinkedQueue类实现接口

3.1 初始化节点对象

Node front,rear;

	public LinkedQueue() {
		front=rear=new Node();//初始化头尾节点 构造空的队列
	}

3.2 返回链队列的长度


	@Override
	public int length() {
		Node p;//声明一个节点 p 用于指向头指针的下一个元素
		int i=0;//初始化一个 i 用于计数
		p = front.next;
		while(p!=null) {
			i++;
			p=p.next;
			
		}
		return i;
		
	}

3.3 空 与 满

@Override
	public boolean full() {
		//
		return false;
	}

	@Override
	public boolean empty() {
		return rear == front;//为空的状态为 头尾指向同一节点
	}

3.4 返回队列中第一个的数据

@Override
	public Object getfront() {
		
		//先判断为 空链表的情况
		if(rear == front) {
			return null;
		}else {
			return front.next.data;
		}
		
	}

3.5 入队 与 出队

@Override
	public boolean enque(Object el) {
		
		  Node p ;//声明一个节点 用于存储 进队的元素 
		  p = new Node(el,null); //因为队列添加元素是从队尾开始添加所以第二个参数为null 
		  rear.next = p;
		  rear = p;//将队尾更换为p return true;
		  return true;
			
		
	}

	@Override
	public Object dlque() {
		Node s;//用于记录待出队
		//队列为空时 
		if(rear == front) {
			return null;
		}
		else {
			s = front.next;
			front.next = s.next;
			//判断是否全部已经出队
			if(s.next==null) {
				rear=front;
			}
			return s.data;
		}
		
	}

3.6 输出队列中的元素的方法

static void pri(Queue q) {
		
		LinkedQueue lq = new LinkedQueue();
		Object ob;
		while (!q.empty()) {
			ob=q.dlque();
			System.out.print(ob.toString()+"");
			lq.enque(ob);
			
		}System.out.println();
		while (!q.empty()) {
			q.enque(lq.dlque());		
		}

	
	}

3.7 main函数中测试

public static void main(String[] args) {
		LinkedQueue lq = new LinkedQueue();
		lq.enque(new Character('w'));
		lq.enque(new Character('o'));
		lq.enque(new Character('r'));
		lq.enque(new Character('d'));
		lq.enque(new Character('w'));
		lq.enque(new Character('o'));
		lq.enque(new Character('r'));
		lq.enque(new Character('d'));
		pri(lq);

	}

3.8 结果

wordword

小结

os:时隔这么这么久,我又开始写了。之前实在是太懒太懒,又不太熟悉写博客,每次写都要花费好长的时间,所以中途就变成了失踪人口。但想了想,笔记嘛,还是得写写的!!!每周花一点时间来整理整理就好了,对的,我一定可以坚持的。至于数据结构之前的内容,应该会补充笔记的,应该应该,啊,说到底还在想偷懒

对于一个队列,显然需要设置两个指针,分别是指向队列的头和尾(分别称为头指针和尾指针),反之,头指针和尾指针可以唯一地确定一个链队列。
空的链队列的裁决条件为头指针和尾指针均指向头节点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值