欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java算法:FIFO队列

程序员文章站 2024-03-18 11:08:46
...

java算法:FIFO队列

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

例1:FIFO队列ADT接口

Java代码 java算法:FIFO队列
  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代码 java算法:FIFO队列
  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代码 java算法:FIFO队列
  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队列,如果最后一项则是栈),或者删除关键字项,自定义项等。