目录
01 设计和实现
- 针对于栈的定义Stack(栈)
- 栈的接口设计这里最频繁的操作是在尾部进行操作,无论是动态数组还是双向链表,在最后一个位置的操作是差不多的.代码段如下所示:
public class Stack<E> { private List<E> list = new ArrayList(); public Stack() { } public void clear() { this.list.clear(); } public int size() { return this.list.size(); } public boolean isEmpty() { return this.list.isEmpty(); } public void push(E element) { this.list.add(element); } public E pop() { return this.list.remove(this.list.size() - 1); } public E top() { return this.list.get(this.list.size() - 1); } }
- 为什么上述不是使用进行一个继承ArrayList的方式,因为在继承的过程之中会将ArrayList之中的所有的方法都继承了下来,其含义就是可以使用ArrayList之中的所有的方法,这种方式是不可取的,可以通过引入ArrayList私有化引入的方式进行调用.
-
java官方的一个栈,java.util.Stack<Integer> S;直接ctrl+鼠标进入查看;可以看到官方继承的是vector,类似于继承ArrayList,它的线程是安全的,自己写的线程是不安全的.
02 应用举例
- 比如说,在一个网页上连续点击了三个网址,分别点击后退和前进的操作就是一个访问栈的过程.如果要是前进,就是两个栈之间相互弹出与进入的过程,就是相当于美图秀秀的撤销与前进过程.
03 有效的括号01
- 刷题:20. 有效的括号 题解 - 力扣(LeetCode)
- 解题事例:
- 解题思路
- 方式一:不采用栈的方式(不建议)
public class _20_有效的括号 { public boolean isValid(String s) { /** * [({})] */ while (s.contains("{}") || s.contains("[]") || s.contains("()")) { s = s.replace("{}",""); s = s.replace("[]",""); s = s.replace("()",""); } return s.isEmpty(); } }
04 有效的括号02
- 通过入栈的方式进行操作
package 栈; import java.util.Stack; public class _20_有效的括号 { 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 left = stack.pop(); if(left == '(' && c != ')') return false; if(left == '{' && c != '}') return false; if(left == '[' && c != ']') return false; } } return stack.isEmpty(); } }
05 有效的括号03
- 对上面的代码进行一写修改,使用HashMap的方式进行
package 栈;
import java.util.HashMap;
import java.util.Stack;
public class _20_有效的括号HashMap方式 {
private HashMap<Character,Character> map = new HashMap<>();
public _20_有效的括号HashMap方式()
{
//key - value的过程
map.put('(',')');
map.put('[',']');
map.put('{','}');
}
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 (map.containsKey(c)) {
stack.push(c);
} else//此刻就是只有出现右括号的情况
{
if (stack.isEmpty()) return false;
char left = stack.pop();
if (c != map.get(left)) return false;
}
}
return stack.isEmpty();
}
}
- 使用静态方法和普通的构造函数的方法对比,如下图所示.