上一篇博客,和大家一起分享了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