java算法:FIFO队列

java算法:FIFO队列

FIFO队列是一个ADT,由两个基本操作构成:插入(放入)一个新项,删除(得到)最早插入的项。

例1:FIFO队列ADT接口

Java代码 复制代码
  1. interfaceintQueue{
  2. intQueue(intq);
  3. intempty();
  4. voidput(intq);
  5. intget();
  6. }
interface intQueue{
	intQueue(int q);
	int empty();
	void put(int q);
	int get();
}

使用数组或链表,在常数时间内实现FIFO队列ADT的get和put操作。

例2:FIFO队列的链表实现

Java代码 复制代码
  1. publicclassintQueue{
  2. privateclassNode{
  3. intitem;
  4. Nodenext;
  5. Node(intitem){
  6. this.item=item;
  7. next=null;
  8. }
  9. }
  10. privateNodehead,tail;
  11. intQueue(intmax){
  12. head=null;
  13. tail=null;
  14. }
  15. booleanempty(){
  16. return(head==null);
  17. }
  18. voidput(intitem){
  19. Nodet=tail;
  20. tail=newNode(item);
  21. if(empty()){
  22. head=tail;
  23. }else{
  24. t.next=tail;
  25. }
  26. }
  27. intget(){
  28. intv=head.item;
  29. Nodet=head.next;
  30. head=t;
  31. returnv;
  32. }
  33. }
public class intQueue{
	private class Node{
		int item;
		Node next;
		Node(int item){
			this.item = item; 
			next = null;
		}
	}
	private Node head, tail;
	intQueue(int max){
		head = null;
		tail = null;
	}
	boolean empty(){
		return (head == null);
	}
	void put(int item){
		Node t = tail;
		tail = new Node(item);
		if(empty()){
			head = tail;	
		}else{
			t.next = tail;
		}
	}
	int get(){
		int v = head.item;
		Node t = head.next;
		head = t;
		return v;
	}
}

数组要求自始自终都要为预计的最大的项数保留足够的空间,而链表表示使用的空间与数据结构中的元素个数成比例,但要为指针分配额外的空间,并且每个操作都要花分配和释放内存的额外时间。

例3:FIFO队列的数组实现

Java代码 复制代码
  1. publicclassintQueue{
  2. privateint[]q;
  3. privateintN,head,tail;
  4. intQueue(intmax){
  5. q=newint[maxN+1];
  6. head=N;
  7. tail=0;
  8. }
  9. booleanempty(){
  10. return(head%N==tail);
  11. }
  12. voidput(intitem){
  13. q[tail++]=item;
  14. tail=tail%N;
  15. }
  16. intget(){
  17. head=head%N;
  18. returnq[head++];
  19. }
  20. }
public class intQueue{

	private int[] q;
	private int N, head, tail;

	intQueue(int max){
		q = new int[maxN + 1];
		head = N;
		tail = 0;
	}
	boolean empty(){
		return (head%N == tail);
	}
	void put(int item){
		q[tail++] = item;
		tail = tail%N;
	}
	int get(){
		head = head%N;
		return q[head++];
	}
}

拓展:双端队列,删除随机项队列(如果第一项则是FIFO队列,如果最后一项则是栈),或者删除关键字项,自定义项等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值