双端栈(Deque Stack)
双端栈(Deque)是一种特殊的栈,它允许在栈的两端进行插入和删除操作。双端栈可以用数组或链表实现。
使用数组实现的双端栈,我们需要维护两个指针,一个指向栈底,另一个指向栈顶。当栈从一端插入元素时,该指针移动到该端;当栈从另一端插入元素时,该指针移动到该端。
以下是使用 Java 实现一个数组双端栈的示例代码:
public class ArrayDeque {
private int capacity;
private int[] array;
private int left; // 左端指针
private int right; // 右端指针
public ArrayDeque(int capacity) {
this.capacity = capacity;
this.array = new int[capacity];
this.left = -1;
this.right = capacity;
}
public void pushLeft(int x) {
if (isFull()) {
throw new RuntimeException("Deque is full");
}
left++;
array[left] = x;
}
public void pushRight(int x) {
if (isFull()) {
throw new RuntimeException("Deque is full");
}
right--;
array[right] = x;
}
public int popLeft() {
if (isEmpty()) {
throw new RuntimeException("Deque is empty");
}
int x = array[left];
left--;
return x;
}
public int popRight() {
if (isEmpty()) {
throw new RuntimeException("Deque is empty");
}
int x = array[right];
right++;
return x;
}
public int peekLeft() {
if (isEmpty()) {
throw new RuntimeException("Deque is empty");
}
return array[left];
}
public int peekRight() {
if (isEmpty()) {
throw new RuntimeException("Deque is empty");
}
return array[right];
}
public boolean isEmpty() {
return left == -1 && right == capacity;
}
public boolean isFull() {
return left + 1 == right || left == capacity - 1 || right == 0;
}
}
在上面的代码中,我们使用了一个整型数组来存储元素,以及两个整型变量 left 和 right 分别作为左端和右端指针。构造函数用于初始化双端栈的容量、数组和指针。pushLeft() 和 pushRight() 方法用于在左端和右端插入元素,popLeft() 和 popRight() 方法用于从左端和右端弹出元素,peekLeft() 和 peekRight() 方法用于返回左端和右端元素的值,isEmpty() 和 isFull() 方法用于判断双端栈是否为空或已满。在 isFull() 方法中,我们判断左端指针和右端指针是否相邻或到达边界。