栈的数组实现

栈的数组实现


 1/**
 2 * 使用数组实现一个栈,并实现自动扩容
 3 * <p>
 4 * 使用数组实现的栈叫做 <b>【顺序栈】</b>
 5 *
 6 * @author wangy
 7 * @version 1.0
 8 * @date 2021/6/24 / 13:54
 9 */
10public class StackByArray {
11
12    private Object[] data;
13
14    private final int DEFAULT_SIZE = 10;
15
16    private int size;
17
18    private int cap;
19
20    public StackByArray() {
21        this.data = new Object[DEFAULT_SIZE];
22        this.cap = DEFAULT_SIZE;
23    }
24
25    public StackByArray(int cap) {
26        this.data = new Object[cap];
27        this.cap = cap;
28    }
29
30    boolean isEmpty() {
31        return size == 0;
32    }
33
34    boolean isFull() {
35        return size == cap;
36    }
37
38    int size() {
39        return size;
40    }
41
42    // 按照出栈顺序打印栈元素
43    void printAll() {
44        System.out.print("[");
45        for (int i = size; i > 1; ) {
46            System.out.print(data[--i] + ", ");
47        }
48        System.out.println(isEmpty() ? "]" : data[0] + "]");
49    }
50
51    /**
52     * 入栈, 将数据添加到右边
53     * <p>
54     * 当栈空间满时,将栈容量增加1倍
55     * <p>
56     * 均摊时间复杂度:O(1)
57     *
58     * @param e 待入栈元素
59     */
60    void push(int e) {
61        if (isFull()) {
62            cap =  cap + cap;
63            Object[] newData = new Object[cap];
64            // copy data
65            for (int i = 0; i < size ; i++) {
66                newData[i] = data[i];
67            }
68            data = newData;
69        }
70        data[size++] = e;
71    }
72
73    /**
74     * 出栈,右边先出
75     */
76    Object pop() {
77        if (isEmpty()) throw new ArrayStoreException("Stack Empty!");
78
79        return data[--size];
80    }
81
82    Object top(){
83        return data[size -1];
84    }
85
86    public static void main(String[] args) {
87        StackByArray stack = new StackByArray(3);
88        stack.push(1);
89        stack.push(2);
90        stack.push(3);
91        stack.push(4);
92        stack.printAll();
93        stack.pop();
94        stack.pop();
95        stack.printAll();
96
97    }
98}