Example003
题目
如果允许在循环队列的两端都可以进行插入和删除操作,要求:
- 写出循环队列的类型定义。
- 分别写出从队尾删除和从队头插入的算法。
分析
本题实际考查的是双端队列的代码实现。具体可参考:双端队列。
注意:
- 约定队头指针指向队头元素;队尾指针指向队尾元素的下一位置。
- 有些书中给出的代码实现,是约定的队头指针指向队头元素的前一位置,队尾指针指向队尾元素,具体根据实际情况来即可。
图解
略。
C实现
核心代码:
typedef struct {
int data[MAXSIZE];
int front;
int back;
} DoubleEndedQueue;
int pushFront(DoubleEndedQueue *deque, int ele) {
if (isFull(*deque)) {
return 0;
}
deque->front = (deque->front - 1 + MAXSIZE) % MAXSIZE;
deque->data[deque->front] = ele;
return 1;
}
int popBack(DoubleEndedQueue *deque, int *ele) {
if (isEmpty(*deque)) {
return 0;
}
deque->back = (deque->back - 1 + MAXSIZE) % MAXSIZE;
*ele = deque->data[deque->back];
return 1;
}
完整代码请参考:DoubleEndedQueue.c。
Java实现
核心代码:
public class DoubleEndedQueue {
private Queue deque;
public void pushFront(int ele) throws Exception {
if (isFull()) {
throw new Exception("队满则不能入队!");
}
deque.front = (deque.front - 1 + MAXSIZE) % MAXSIZE;
deque.data[deque.front] = ele;
}
public int popBack() throws Exception {
if (isEmpty()) {
throw new Exception("队空则不能出队!");
}
deque.back = (deque.back - 1 + MAXSIZE) % MAXSIZE;
return deque.data[deque.back];
}
}
class Queue {
int[] data;
int front;
int back;
}
完整代码请参考:DoubleEndedQueue.java。
测试代码请参考:DoubleEndedQueueTest.java。
|