栈是一种先进后出的结构,比如你放书会把书放在最上面,最先放的书在最下面,而你拿书却是从最上面拿,最后放的最先拿到,栈正是怎么一种结构,我们规定最上面的位置叫做栈顶,我们向栈中添加元素是添加到栈顶,向栈中取出元素是从栈顶取出的,我们先来定义一个Stack接口,里面规定了一个栈包含的操作

  1. public interface Stack<E> {
  2. //向栈中压入一个元素
  3. void push(E e);
  4. //将栈顶元素弹出
  5. E pop();
  6. //栈是否为空
  7. boolean isEmpty();
  8. //获得栈中元素的个数
  9. int getSize();
  10. //获得栈顶元素
  11. E peek();
  12. }

下面我们将使用上面实现的Array来实现一个ArrayStack,我们把数组的最后位置定义为栈顶

  1. public class ArrayStack<E> implements Stack<E> {
  2. private Array<E> data;
  3. public ArrayStack(int capacity) {
  4. data = new Array<>(capacity);
  5. }
  6. public ArrayStack() {
  7. data = new Array<>();
  8. }
  9. @Override
  10. public void push(E e) {
  11. data.addLast(e);
  12. }
  13. @Override
  14. public E pop() {
  15. return data.removeLast();
  16. }
  17. @Override
  18. public boolean isEmpty() {
  19. return data.isEmpty();
  20. }
  21. @Override
  22. public int getSize() {
  23. return data.getSize();
  24. }
  25. @Override
  26. public E peek() {
  27. return data.getLast();
  28. }
  29. public String toString() {
  30. StringBuilder res = new StringBuilder();
  31. res.append("Stack: ");
  32. res.append("[");
  33. for (int i = 0; i < data.getSize(); i++) {
  34. res.append(data.get(i));
  35. if (i != data.getSize()-1) {
  36. res.append(", ");
  37. }
  38. }
  39. res.append("] top");
  40. return res.toString();
  41. }
  42. }

上面的代码极其的简单,只要仔细的阅读就可以完全的理解,这里不多做解释。

下面介绍一个有关于栈的题目,此题来自于LeetCode第20题

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

这道题的解题思路是,如果遇到左括号’(‘, ‘[‘, ‘{‘,那么将左括号压入栈中,如果遇到右括号,那么将栈顶的左括号弹出,判断两个括号是否匹配,如果不匹配返回fasle,如果匹配进行下一轮,最后如果字符串遍历完毕,如果栈为空说明匹配成功,如果栈不为空,所以左边的括号多匹配失败,代码如下

  1. import java.util.Stack;
  2. class Solution {
  3. public boolean isValid(String s) {
  4. //创建一个空栈
  5. Stack<Character> stack = new Stack<>();
  6. //遍历字符串
  7. for (int i = 0; i < s.length(); i++) {
  8. char c = s.charAt(i);
  9. //如果是左括号,则压入栈中
  10. if (c == '(' || c == '[' || c == '{') {
  11. stack.push(c);
  12. } else {
  13. //如果是右括号 先判断栈是否为空
  14. if (stack.isEmpty()) {
  15. return false;
  16. }
  17. //获得栈顶的左括号
  18. char charTop = stack.pop();
  19. //下面三种皆为不匹配的情况
  20. if (c == ')' && charTop != '(') {
  21. return false;
  22. }
  23. if (c == ']' && charTop != '[') {
  24. return false;
  25. }
  26. if (c == '}' && charTop != '{') {
  27. return false;
  28. }
  29. }
  30. }
  31. //这里不能直接返回true 要根据栈是否为空决定返回值
  32. return stack.isEmpty();
  33. }
  34. }