数据结构与算法-栈
先进后出的一种数据结构。
特殊的数组或者链表,线性表。
存在限制条件,只能操作栈顶。
一:有趣的题目
1.设计一个括号匹配的功能
package com.jun.algorithm.foundation.main; import java.util.Objects; /** * 括号问题 ** 右括号来了,就找栈顶看是否可以匹配,匹配就出栈 * 最后栈应该是空 * * @author caojun */ public class Bracket { public static boolean isOk(String str) { StackImpl
brackets = new StackImpl<>(20); char[] chars = str.toCharArray(); for (Character c : chars) { switch (c) { case '{': case '(': case '[': brackets.push(c); break; case '}': if (Objects.equals('{', brackets.pop())) { break; } else { return false; } case ']': if (Objects.equals('[', brackets.pop())) { break; } else { return false; } case ')': if (Objects.equals('(', brackets.pop())) { break; } else { return false; } } } return brackets.isEmpty(); } }
二:栈
1.具体的实现
package com.jun.algorithm.foundation.main; /** * 栈的接口 * * @param- * @author caojun */ public interface IStack
- { void push(Item item); Item pop(); int size(); boolean isEmpty(); }
具体是数组方式实现:
package com.jun.algorithm.foundation.main; /** * 栈的实现 * 通过数组实现 * * @author caojun */ public class StackImpl- implements IStack
- { private Item[] a = (Item[]) new Object[1]; private int n = 0; public StackImpl() { } public StackImpl(int cap) { a = (Item[]) new Object[cap]; } @Override public void push(Item item) { judgeSize(); a[n++] = item; } @Override public Item pop() { if (isEmpty()) { return null; } Item item = a[--n]; a[n] = null; return item; } @Override public int size() { return 0; } @Override public boolean isEmpty() { return false; } private void judgeSize() { // 扩展 if (a.length < n) { reSize(2 * a.length); } if (n > 0 && n < a.length / 2) { reSize(a.length / 2); } } private void reSize(int size) { Item[] temp = (Item[]) new Object[size]; for (int i = 0; i < n; i++) { temp[i] = a[i]; } a = temp; } }