栈
栈是一种先进后出的结构,比如你放书会把书放在最上面,最先放的书在最下面,而你拿书却是从最上面拿,最后放的最先拿到,栈正是怎么一种结构,我们规定最上面的位置叫做栈顶,我们向栈中添加元素是添加到栈顶,向栈中取出元素是从栈顶取出的,我们先来定义一个Stack接口,里面规定了一个栈包含的操作
public interface Stack<E> {//向栈中压入一个元素void push(E e);//将栈顶元素弹出E pop();//栈是否为空boolean isEmpty();//获得栈中元素的个数int getSize();//获得栈顶元素E peek();}
下面我们将使用上面实现的Array来实现一个ArrayStack,我们把数组的最后位置定义为栈顶
public class ArrayStack<E> implements Stack<E> {private Array<E> data;public ArrayStack(int capacity) {data = new Array<>(capacity);}public ArrayStack() {data = new Array<>();}@Overridepublic void push(E e) {data.addLast(e);}@Overridepublic E pop() {return data.removeLast();}@Overridepublic boolean isEmpty() {return data.isEmpty();}@Overridepublic int getSize() {return data.getSize();}@Overridepublic E peek() {return data.getLast();}public String toString() {StringBuilder res = new StringBuilder();res.append("Stack: ");res.append("[");for (int i = 0; i < data.getSize(); i++) {res.append(data.get(i));if (i != data.getSize()-1) {res.append(", ");}}res.append("] top");return res.toString();}}
上面的代码极其的简单,只要仔细的阅读就可以完全的理解,这里不多做解释。
下面介绍一个有关于栈的题目,此题来自于LeetCode第20题
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
这道题的解题思路是,如果遇到左括号’(‘, ‘[‘, ‘{‘,那么将左括号压入栈中,如果遇到右括号,那么将栈顶的左括号弹出,判断两个括号是否匹配,如果不匹配返回fasle,如果匹配进行下一轮,最后如果字符串遍历完毕,如果栈为空说明匹配成功,如果栈不为空,所以左边的括号多匹配失败,代码如下
import java.util.Stack;class Solution {public boolean isValid(String s) {//创建一个空栈Stack<Character> stack = new Stack<>();//遍历字符串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 charTop = stack.pop();//下面三种皆为不匹配的情况if (c == ')' && charTop != '(') {return false;}if (c == ']' && charTop != '[') {return false;}if (c == '}' && charTop != '{') {return false;}}}//这里不能直接返回true 要根据栈是否为空决定返回值return stack.isEmpty();}}
