双端栈(Deque Stack)

title

双端栈(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() 方法中,我们判断左端指针和右端指针是否相邻或到达边界。

powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:00

results matching ""

    No results matching ""