[데이터 구조] 대기 열의 세 가지 실현 방식

49390 단어 데이터 구조
1. 정의
대기 열 은 한 끝 에 만 삽입 되 고 다른 한 끝 에 만 삭제 되 는 질서 있 는 선형 표 입 니 다. 대기 열 에 첫 번 째 로 삽 입 된 요소 도 첫 번 째 로 삭 제 된 요소 이기 때문에 대기 열 은 선진 적 인 선 출 (FIFO) 선형 표 입 니 다.
2. 조작
1) 주요 조작
  • void addQueue (T data): 팀 에 들 어가 서 팀 끝 에 요 소 를 삽입 합 니 다
  • T removeQueue (): 팀 을 나 와 팀 의 첫 번 째 요 소 를 삭제 하고 되 돌려 줍 니 다.

  • 2) 보조 조작
  • boolean isEmpty (): 대기 열 이 비어 있 는 지 여부
  • int size (): 대기 열 에 있 는 요소 개 수 를 되 돌려 줍 니 다
  • T peek (): 팀 의 첫 번 째 요 소 를 되 돌려 주지 만 삭제 하지 않 습 니 다
  • T poll (): 팀 의 끝 요 소 를 되 돌려 주지 만 삭제 하지 않 습 니 다
  • 3. 실현 방식
    1) 단순 순환 배열 기반 구현
    package dataStructure;
    
    public class ArrayQueue {
    	private int[] a;
    	private int front;
    	private int rear;
    	private int size;//    
    	private int items ;
    	
    	public ArrayQueue(int MaxSize) {
    		size = MaxSize;
    		a = new int[size];
    		front = 0;
    		rear = -1;
    		items = 0;
    	}
    	
    	boolean isEmpty() {
    		return rear == -1;
    	}
    	
    	boolean isFull() {
    		return items == size;
    	}
    	
    	int size() {
    		return items;
    	}
    	void addQueue(int value) {
    		if(isFull()) {
    			System.out.println("  !");
    			return;
    		}
    		rear = ++rear % size;
    		items++;
    		a[rear] = value;
    	}
    	
    	int delQueue() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return 0;
    		}
    		items--;
    //		front = ++front % size;
    //		return a[front];
    		return a[front++ % size];	
    	}
    	
    	int peek() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return 0;
    		}
    		return a[front];
    	}
    	
    	int poll() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return 0;
    		}
    		return a[rear];
    	}
    	void dispaly() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return;
    		}
    		int item = front;
    		for(int i = 0; i < size() ; i++) {
    			System.out.print(a[item++ % size]+" ");
    		}
    		System.out.println();
    	}
    	public static void main(String[] args) {
    		ArrayQueue aq = new ArrayQueue(5);
    		aq.addQueue(1);
    		aq.addQueue(2);
    		aq.addQueue(6);
    		aq.addQueue(5);
    		aq.dispaly();
    		aq.delQueue();
    		aq.dispaly();
    		System.out.println("    :" + aq.size() + "     : " + aq.size);
    		System.out.println("    :" + aq.peek());
    		System.out.println("    :" + aq.poll());
    		
    	}
    }
    
    

    2) 동적 순환 배열 기반 구현
    package dataStructure;
    
    
    public class DynArrayQueue {
    	private int[] a;
    	private int front;
    	private int rear;
    	private int size;//    
    	private int items ;
    	
    	public DynArrayQueue(int MaxSize) {
    		size = MaxSize;
    		a = new int[size];
    		front = 0;
    		rear = -1;
    		items = 0;
    	}
    	void doubleArray() {
    		int[] newArray =new  int[2 * size];
    		System.arraycopy(a, 0, newArray, 0, size);
    		size = 2 * size;
    		a = newArray;
    	}
    	boolean isEmpty() {
    		return rear == -1;
    	}
    	
    	boolean isFull() {
    		return items == size;
    	}
    	
    	int size() {
    		return items;
    	}
    	void addQueue(int value) {
    		if(isFull()) {
    			doubleArray();
    		}
    		rear = ++rear % size;
    		items++;
    		a[rear] = value;
    	}
    	
    	int delQueue() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return 0;
    		}
    		items--;
    //		front = ++front % size;
    //		return a[front];
    		return a[front++ % size];	
    	}
    	
    	int peek() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return 0;
    		}
    		return a[front];
    	}
    	
    	int poll() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return 0;
    		}
    		return a[rear];
    	}
    	void dispaly() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return;
    		}
    		int item = front;
    		for(int i = 0; i < size() ; i++) {
    			System.out.print(a[item++ % size]+" ");
    		}
    		System.out.println();
    	}
    	public static void main(String[] args) {
    		DynArrayQueue aq = new DynArrayQueue(2);
    		aq.addQueue(1);
    		aq.addQueue(2);
    		aq.addQueue(6);
    		aq.addQueue(5);
    		aq.dispaly();
    		aq.delQueue();
    		aq.dispaly();
    		System.out.println("    :" + aq.size() + "      :" + aq.size);
    		System.out.println("    :" + aq.peek());
    		System.out.println("    :" + aq.poll());
    		
    	}
    }
    
    
    

    3) 링크 기반 의 실현
    package dataStructure;
    
    class QueueNode<T> {
    	private T data;
    	private QueueNode<T> next = null;
    	
    	public QueueNode(T data) {
    		this.data = data;
    	}
    
    	public T getData() {
    		return data;
    	}
    
    	public void setData(T data) {
    		this.data = data;
    	}
    
    	public QueueNode<T> getNext() {
    		return next;
    	}
    
    	public void setNext(QueueNode<T> next) {
    		this.next = next;
    	}
    
    	@Override
    	public String toString() {
    		return data + "->";
    	}
    	
    }
    public class LLQueue<T> {
    	QueueNode<T> front;
    	QueueNode<T> rear;
    	
    	public LLQueue() {
    		front = rear = null;
    	}
    	
    	int size() {
    		int count = 0;
    		QueueNode<T> cur = front;
    		while(cur != null) {
    			count++;
    			cur = cur.getNext(); 
    		}
    		return count;
    	}
    	
    	boolean isEmpty() {
    		//return size() == 0;
    		return front == null;
    	}
    	
    	void addQueue(T data) {
    		QueueNode<T> node = new QueueNode<>(data);
    		if(isEmpty()) {
    			rear = front = node;
    		}else {
    			rear.setNext(node);
    			rear = node; 
    		}
    		
    	}
    	
    	QueueNode<T> removeQueue() {
    		if(isEmpty()) {
    			System.out.println("  !");
    			return null;
    		}
    		if(front == rear)   
    			return front = rear = null;
    		QueueNode<T> del = front;
    		front = front.getNext();
    		return del;
    	}
    	
    	QueueNode<T> peek(){
    		return front;
    	}
    	
    	QueueNode<T> poll(){
    		return rear;
    	}
    	void display(){
    		if(isEmpty()) {
    			System.out.println("  !");
    			return;
    		}
    		QueueNode<T> cur = front;
    		while(cur != null) {
    			System.out.print(cur.getData() + "->");
    			cur = cur.getNext();
    		}
    		System.out.println();
    	}
    	public static void main(String[] args) {
    		LLQueue<Integer> lq = new LLQueue<>(); 
    		lq.addQueue(2);
    		lq.addQueue(5);
    		lq.addQueue(7);
    		lq.display();
    		System.out.println("      :" + lq.removeQueue());
    		lq.display();
    		System.out.println("    :" + lq.size());
    		System.out.println("    :" + lq.peek());
    		System.out.println("    :" + lq.poll());	
    	}
    	
    }
    
    

    좋은 웹페이지 즐겨찾기