2012-11-21 3 views
0

전달 된 q에서 요소를 제거하지 않고 ArrayQueue를 다른 Queue와 병합하는 방법을 작성하는 가장 좋은 방법은 무엇일까 궁금합니다. queue1.mergeQs(queue2)는이 queue2 동안 queue1 = [1,5,2,6,3,7,4,8,9,10][5,6,7,8,9,10]Java에서 병합 대기열

public void mergeQs(ArrayQmerge q){} 

이 방법은 당신이 모두 대기열을 전달하고 새로운 병합 된 큐를 반환하는 경우보다 구현하기가 어려워 보인다 남아있을 것입니다 만들 것이라고했다

eg. queue1 = [1,2,3,4] and queue2 = [5,6,7,8,9,10]. 

. 감사.

그냥 명확히하기 위해 두 대기열의 요소를 인터리브하는 방법을 찾고 있습니다.

+0

참고 사항 : Java에는 'ArrayQueue' 클래스가 없습니다. 'ArrayDeque'와'ArrayBlockingQueue'가 있습니다 - 당신은 하나의 논문을 의미 했습니까? – thkala

+0

내 자신의 Queue 클래스를 구현하는 자체 ArrayQueue 클래스를 만들었습니다. ArrayQmerge 클래스는 ArrayQueue 클래스를 확장합니다. – binary101

+0

누군가가 귀하의 질문에 대답하기가 조금 더 어려워졌습니다. 당신 만이'ArrayQueue'를 볼 수 있기 때문에. –

답변

1

한 세부 private 필드 자바 같은 클래스의 다른 객체 사이 보이는 있다는 것입니다. 즉, 자신의 클래스의 대기열 만 병합하려는 경우 코드는 요소를 저장하는 데 사용하는 배열과 같은 모든 내부 필드에 대한 모든 액세스 권한을 갖습니다. 당신이 당신의 자신의 사제 ArrayQueue을 사용하고 있기 때문에

public void mergeQs(ArrayQmerge q) { 
    Object[] array = new Object[this.size() + q.size()]; 

    int i; 
    int o; 

    // Interleave elements 
    for (i = 0, o = 0; i < this.size() && i < q.size(); ++i) { 
     array[o++] = this.array[i]; 
     array[o++] = q.array[i]; 
    } 

    // Copy the remaining elements 
    while (i < this.size()) { 
     array[o++] = this.array[i++]; 
    } 

    while (i < q.size()) { 
     array[o++] = q.array[i++]; 
    } 

    this.array = array; 
} 
0

병합 메서드에서 로컬로 새 큐를 만든 다음 클래스의 큐를 로컬 버전에 할당 할 수 있습니다. 당신이 도움이 될

0

: 모든 요소가 큐 헤드가 인덱스 제로되고있는 선형 배열에 저장되어있는 간단한 경우에 대해서는

, 이런 일이 시작이 될 수있다 이것은 추측입니다.

새로운 큐를 생성하고 리턴하는 것은 이미 배열을 뒷받침하는 구조에 요소를 삽입 할 때 나머지 요소를 각 삽입 연산에 대해 한 위치 아래로 이동시키는 것과 같이 이미 쉽고 효율적이라고 말할 수 있습니다.

대안으로 보조 배열이있는 기본 배열을 스와핑하여 public void mergeQs(ArrayQmerge q)을 구현하는 것입니다. 따라서 새로운 대기열을 반환하는 것과 동일한 쉬운 구현을 얻을 수 있지만 동일한 부작용이 발생합니다.

관련 문제