Java栈(基于动态数组实现)

上一篇博客,和大家一起分享了Java动态数组的实现以及相关注意事项,没看过的同学可以先去了解一下,Java动态数组

有了这个动态数组之后,接下来来看看栈。相信大家都对于栈这一种后进先出的数据结构不会陌生,因为应用栈的地方着实不少,例如常见的撤销操作、括号匹配等等。(博客最后将和大家一起实现一个括号匹配的小demo)

首先,先来定义栈的接口

public interface StackInterface<E> {

    E pop();

    E peek();

    void push(E e);

    boolean isEmpty();

    int getSize();
}

如果有读过java源码的同学就会发现,这里申明的接口名称和java内部封装好的Stack接口名是完全一样的,有兴趣的同学在实现自己的栈的同时,也可以去看看java源码里是如何实现的,对自己也是一种提高。

接下来,便可以基于上篇博客的动态数组,来实现栈。

public class ArrayStack<E> implements StackInterface<E> {

    private Array<E> array;

    public ArrayStack(int capacity) {
        array = new Array<>(capacity);
    }

    public ArrayStack() {
        array = new Array<>();
    }

    @Override
    public E pop() {
        return array.removeLast();
    }

    //看一看栈顶远元素
    @Override
    public E peek() {
        return array.getLast();
    }

    @Override
    public void push(E e) {
        array.addLast(e);
    }

    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }

    @Override
    public int getSize() {
        return array.getSize();
    }

    public int getCatacity() {
        return array.getCapacity();
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("Stack: ");
        res.append('[');
        for (int i = 0; i < array.getSize(); i++) {
            res.append(array.get(i));
            if (i != array.getSize() - 1) {
                res.append(", ");
            }
        }
        res.append("] Top");
        return res.toString();
    }
}

大家可以看到,在有了动态数组之后,实现栈其实是非常容易的一件事情。那么有了栈之后,我们就用他来搞一点事情,用来判断括号是否可以进行匹配。

“{[()]}”类似的可以匹配,“{(}}”类似的无法匹配。

对于这样一个问题,我们怎么利用栈来实现呢?

我们逐一便利数组,对于左边的括号'{'、'['、'(',我们直接将其入栈,而对于右边的括号'}'、']'、')',我们就将栈定的元素取出进行匹配,接下来一起看看代码实现。

public class BracketsTest {
    public static boolean isBracketsVaild(String s) {

//        Stack<Character> stack = new Stack<>();
        ArrayStack<Character> stack = new ArrayStack<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
            } else {
                if (stack.isEmpty()) {
                    return false;
                }
                char topChar = stack.pop();
                if (c == ')' && topChar != '(') {
                    return false;
                }
                if (c == ']' && topChar != '[') {
                    return false;
                }
                if (c == '}' && topChar != '{') {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

需要注意的是在循环结束后,判断栈是否为空,如果不为空,同样是无法匹配。

注释的Stack是java提供给我们的栈,感兴趣的同学可以比较下,java的栈和我们自己实现的栈有什么异同。

栈就和大家分享到这里,下一篇博客,将和大家一起分享基于动态数组的队列,感谢阅读~

还请需要转载的同学注明出处:https://blog.csdn.net/sinat_33150417/article/details/81744073

猜你喜欢

转载自blog.csdn.net/sinat_33150417/article/details/81744073