2 数据结构之栈
2.1 什么是栈
栈是一种线性结构,相比数组,栈的操作是数组的子集;
只能从一端添加元素,从同一端取出元素,这一端称为栈顶。
在java中栈是Vector的一个子类,它实现了一个标准的后进先出的栈。除了包括由Vector定义的所有方法,也定义了自己的一些方法。
2.2 栈的基本实现
这里在上一节实现的动态数组的基础之上来实现栈这种数据接口。
先写栈的接口Stack.java
package cc.myall.demo02; public interface Stack<E> { int getSize(); boolean isEmpty(); void push(E e);
E pop(); E peek(); }
实现的栈要有接口中定义的这几种方法。另外 我们在Array类中再添加removeLast()和getLast(),方面我们调用来实现栈的功能。
//删除最后一个元素 public E removeLast() { return remove(size-1); } //获取最后一个元素 public E getLast() { return get(size - 1); }
由于是基于数组实现的栈,那我们就把栈取名为:ArrayStack.java
package cc.myall.demo02;
public class ArrayStack<E> implements Stack<E>{ Array<E> array; public ArrayStack(int capacity) { array = new Array<>(capacity); } public ArrayStack() { array = new Array<>(); } @Override public int getSize() { return array.getSize(); } @Override public boolean isEmpty() { return array.isEmpty(); } @Override public void push(E e) { array.addLast(e); } @Override public E pop() { return array.removeLast(); } @Override public E peek() { return array.getLast(); } }
这样,栈这种数据结构就完成。
2.3 小应用:括号的匹配
题目地址:https://leetcode-cn.com/problems/valid-parentheses/
解题思路:利用栈这种数据结构。
我们使用的是java内置的栈。
import java.util.Stack; class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); int len = s.length(); for(int i = 0; i < len; 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(); } }
提交获得通过。
代码: https://github.com/zhang-anan/DataStructure/tree/master/src/cc/myall/demo02