4.栈
栈是一种特殊的线性表,只能在一端进行操作
往栈中添加元素的操作,一般叫做 push,入栈
从栈中移除元素的操作,一般叫做 pop,出栈(只能移除栈顶元素,也叫做:弹出栈顶元素)
后进先出的原则,Last In First Out,LIFO
注意:这里说的 “栈” 与内存中的 “栈空间” 是两个不同的概念;
栈的应用 – 浏览器的前进和后退
类似的应用场景:软件的撤销(Undo)、恢复(Redo)功能
栈的接口设计
int size(); // 元素的数量
boolean isEmpty(); // 是否为空
void push(E element); // 入栈
E pop(); // 出栈
E top(); // 获取栈顶元素
void clear(); // 清空
栈的内部实现是否可以直接利用以前学过的数据结构?
- 动态数组、链表
动态数组实现栈
利用前面写的动态数组实现栈,极其简单;
package com.zj;
import com.zj.list.ArrayList;
import java.util.List;
public class Stack<E> extends ArrayList<E> {
//用的继承,有一点不合理,就是把其他的方法也继承过来了,把动态数组变成栈的一部分
private List<E> list = (List<E>) new ArrayList<>();
public void clear(){
list.clear();
}
public int size(){
return list.size();
}
public boolean isEmpty(){
return list.isEmpty();
}
public void push(E element){
list.add(element);
}
public E pop(){
return list.remove(list.size()-1);
}
public E top(){
return list.get(list.size()-1);
}
}
练习:
有效的括号:
package 栈;
import java.util.Stack;
public class _20_有效的括号2 {
//第二种,使用栈的方式
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
String[] strings = {};
int length = strings.length;
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();
}
}