2012-11-04 2 views
1

숙제를위한 배열을 사용하여 큐 ADT를 구현하려고합니다. 연결된 목록을 사용할 것입니다.하지만 교수는 우리가 배우기를 원합니다. 새로운 것 또는 뭔가 XD). 어쨌든, 큐의 끝 부분에 요소를 추가하는 메서드를 만들고 있는데,이 동일한 메서드는 범위를 벗어나는 경우 새로운 크기 조정 배열을 만들어야합니다.이 메서드는 제가 고민하고있는 메서드입니다 (enqueue() 메소드). 여기 내 코드는 다음과 같습니다.배열을 사용하여 큐를 구현하십시오. - Java

import java.util.Arrays; 


public class Queue<T> implements QueueInterface<T> { 

    private T[] a; 
    private int sz; 

    public Queue(int capacity) { 
     sz = 0; 
     @SuppressWarnings("unchecked") 
     T[] tempQueue = (T[])new Object[capacity]; 
     a= tempQueue; 
    } 

    public void enqueue(T newEntry) { 
     try { 
     for (int i=0; i<a.length; i++) { 
       if (a[i] == null) { 
        a[i] = newEntry; 
        break; 
       } 
      } 
     sz++; 
     } 
     catch (ArrayIndexOutOfBoundsException e) { 
      @SuppressWarnings("unchecked") 
      T[] tempQueue = (T[])new Object[a.length*+5]; 
      a= tempQueue; 
      for (int i=0; i<a.length; i++) { 
       if (a[i] == null) { 
        a[i] = newEntry; 
        break; 
       } 

      } 
     } 
    } 

    public T dequeue() { 
     T result = a[0]; 
     a[0] = null; 
     for (int i=1; i<a.length;i++) { 
      a[i-1] = a[i]; 
     } 
     sz--; 
     return result; 
    } 

    public T getFront() { 
     return a[0]; 
    } 

    public boolean isEmpty() { 
     for (int i=0; i<a.length; i++) { 
      if (a[i] != null) { 
       return false; 
      } 
     } 
     return true; 
    } 

    public void clear() { 
     for (int i=0; i<a.length; i++) { 
      a[i] = null; 
      sz--; 
     } 
    } 

    @Override 
    public String toString() { 
     return "Queue [a=" + Arrays.toString(a) + ", sz=" + sz + "]"; 
    } 

} 

여러분 모두에게 감사드립니다 !!!

+1

하는 일반적인 방법 당신이 뭔가를 할 수있는 쉬운 방법을 평가하는 얻기를 위해 당신이 그것을 할 것입니다 힘든 길 먼저. =) –

+0

귀하의 구체적인 문제는 무엇입니까 - 우리는 결함에 대한 귀하의 코드를 연구하는 것보다 더 할 일이 있습니다.배열 대기열의 경우 배열 자체와 머리 (대기열에서 대기열에서 제외) 및 꼬리 (대기열에 대기열에 넣기) 색인 값이 필요하다는 점을 기억하십시오. 배열의 끝에 도달하면 꼬리 값이 머리보다 커질 수 있으므로 다시 "줄 바꿈"합니다. –

+0

알다시피, 나는 특히 도움을 청할 때이 사이트에서 매우 예의를 가지려고 노력한다. 그리고 내가 충분히 구체적이지 않다면 미안하다. (나는 여전히 이것에 매달려있다.) 솔직히 말하면, 할 일이 있다면 할 일이 있다면 할 수 있습니다. 나는 당신에게 더 많은 세부 사항을 묻는 데 아무런 문제가 없지만 적어도 그것에 대해 예의가 될 수있다. 어쨌든 당신이 대답을 주셔서 감사합니다 – salxander

답변

1

예외적 인 부분을 감지하려면 배열 길이를 확인하십시오. 예외적 인 경우는 예외입니다.

은 경험칙은 고정 된 양만큼의 크기를 증가하지만의 비율로 증가하지 않다 System.arraycopy에

을 배열 복사 적절한 크기의 새로운 배열을 생성하고 사용 원래 크기 (예 : 30 % 큰)

0

크기 조정 논리를 ensureSize 또는 뭔가라는 개인 메서드에 넣어보십시오. 원하는 크기를 확인하십시오. 크기가 너무 작 으면 배열의 크기를 조정하고 내용을 복사합니다. 배열 크기를 증가시킬 필요가있는 모든 메서드에서이 메서드를 호출합니다.

0

구현이 배열을 사용하여 큐를 구현하는 가장 효율적인 방법은 아니지만이 방법으로 구현 한 경우 엔큐 대기 메서드가 필요한 것보다 약간 복잡합니다.

필드가 sz인데 첫 번째 null이 아닌 항목을 찾기 위해 새 항목을 넣는 대신 확인하는 데 사용할 수 있습니다. 또한 dequeue가 마지막으로 전달 된 요소를 지우지 않기 때문에 null이 아닌 값에 대한 검색은 제대로 작동하지 않습니다.

sz 필드는 예외에 의한 필요성을 감지하기보다는 크기를 조정해야 할 때 알려줍니다.

0

Alan Krueger의 답변을 보완합니다. 크기를 조정할 때 전체 배열을 다시 반복 할 필요가 없습니다. 이전 배열의 길이를 저장하는 임시 변수를 만들고 그 배열에서 반복을 시작하십시오.

2

배열을 사용하여 큐를 구현하려는 경우 원형 배열을 사용하는 것이 가장 좋은 방법이라고 생각합니다. 그렇게하면 dequeue 때 모든 요소를 ​​한 단계 앞으로 이동할 필요가 없습니다. 그러나 당신이 크기가 큰 (on-bounded) 큐를 구현하기를 원하기 때문에 순환 배열 구현은 약간 어려워집니다. 다음은 몇 가지 유용한 링크, 그것을 위해

  • Determine beginning & and of the queue
  • 당신이 구현하려는 경우 Circular buffer

  • Re-size a circular array
    • , 바로 구글이다.

      (이 질문에 대한 답하지 않을 수 있습니다,하지만 난 당신의 질문에서 말씀 드릴 수 없습니다.)

    +0

    @ 잰더 - 여기에 지혜가 있습니다. 주의를 기울이십시오. –

    관련 문제