Например, у меня есть первая очередь: фронт[1 3 5 7]назад и вторая очередь вперед[2 4 6 8]назад. Новая объединенная очередь должна быть: front[1 2 3 4 5 6 7 8]back. Или первая очередь: передняя[1 3 3 7]задняя, вторая: передняя[2 4 5 7 8]задняя. Новая объединенная очередь: передняя[1 2 3 3 4 5 7 7 8]задняя. И мы не можем использовать какие-либо типы сортировки. Вот моя реализация очереди:
public class QueueImpl implements IntQueue {
protected int capacity;
public static final int CAPACITY = 100;
protected int Q[];
protected int f = 0, r = 0;
public QueueImpl() {
this(CAPACITY);
}
public QueueImpl(int cap) {
capacity = cap;
Q = new int[capacity];
}
public void enqueue(int value) throws Exception {
if (getSize() == capacity - 1) {
throw new Exception("Full"); //To change body of generated methods, choose Tools | Templates.
}
Q[r] = value;
r = (r + 1) % capacity;
}
public int dequeue() throws Exception {
int element;
if (isEmpty()) {
throw new Exception("Empty"); //To change body of generated methods, choose Tools | Templates.
}
element = Q[f];
f = (f + 1) % capacity;
return element;
}
public int getSize() {
return (capacity - f + r) % capacity;
}
public boolean isEmpty() {
return (f == r);
}
public String toString() {
int z = f;
String s;
s = "f[";
if (getSize() >= 1) {
s += Q[0];
for (int i = 1; i <= getSize() - 1; i++) {
s += " " + Q[z + 1];
z = (z + 1) % capacity;
}
}
return s + "]b";
}
}
Мое решение: открытый класс Assign2Problem3Solution {
public static IntQueue merge(IntQueue q1, IntQueue q2) throws Exception {
IntQueue merged = new QueueImpl();
int a, b, k, t, m;
if (a < b) {
k = a;
t = b - a;
} else {
k = b;
t = a - b;
}
for (int i = 0; i < k; i++) {
a = q1.dequeue();
b = q2.dequeue();
if (a < b) {
merged.enqueue(a);
merged.enqueue(b);
} else if (b < a) {
merged.enqueue(b);
merged.enqueue(a);
}
}
if (q1.getSize() > q2.getSize()) {
for (int i = 0; i < t; i++) {
m = q1.dequeue();
merged.enqueue(m);
}
} else if (q1.getSize() < q2.getSize()) {
for (int i = 0; i < t; i++) {
m = q2.dequeue();
merged.enqueue(m);
}
}
return merged;
}
}
Вот код, который работает и удовлетворяет условиям:
IntQueue объединена = новая QueueImpl(); инт а, б;
if (!q1.isEmpty() && !q2.isEmpty()) {
a = q1.dequeue();
b = q2.dequeue();
while (true) {
if (a < b) {
merged.enqueue(a);
if (q1.isEmpty()) {
merged.enqueue(b);
break;
}
a = q1.dequeue();
} else {
merged.enqueue(b);
if (q2.isEmpty()) {
merged.enqueue(a);
break;
}
b = q2.dequeue();
}
}
}
if (q1.getSize() > 0) {
while (!q1.isEmpty()) {
a = q1.dequeue();
merged.enqueue(a);
}
} else if (q2.getSize() > 0) {
while (!q2.isEmpty()) {
b = q2.dequeue();
merged.enqueue(b);
}
}
return merged;