一、概述:
栈(stack):栈是一种线性的结构,这种数据结构仅限在线程表的一段进行插入和删除操作。其中线性表插入的和删除的一段称为栈顶(top),不循序插入和删除的一段称为栈底(bottom)。所以栈数据结构是遵循“后入先出”,也就是“LIFO”。
二、栈的特征
(1)栈也是一种线性的机构。
(2)相比较数组,占对应的操作是数组的子集。
(3)只能从一端添加元素,也只能从一端取出元素,这一端称为栈顶。
(4)栈是一种后进先出的数据结构。称为:Liast In First Out(LIFO)
三、栈的应用:
(1)无处不在的Undo操作(撤销)。
(2)程序调用的系统栈。
(3)括号匹配-编译器
通过java.util.Stack来实现一个括号匹配器:
public 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 topChar = stack.pop();
if(c == ')' && topChar != '(')
return false;
if(c == ']' && topChar != '[')
return false;
if(c == '}' && topChar != '{')
return false;
}
}
return stack.isEmpty();
}
public static void main(String[] args) {
System.out.println((new Solution()).isValid("()[]{}"));
System.out.println((new Solution()).isValid("()[]{]}"));
}
}
java.util.Stack这个栈数据结构得底层是通过java.util.Vector实现的,Stack继承了Vector,而Vector和ArrayList一样实现了List接口,Vector和ArrayList是实现原理上是非常相似的,它们都是通过数组实现的,不过与ArrayList不同的是,Vector支持线程的同步,即某一个时刻只有一个线程能够操作Vector,避免了多线程同时引起的不一致性,它的同步是通过synchronized实现的,同步需要很高的花费,访问它要比访问ArrayList要慢;Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。
四、栈的实现:
(一) 通过自定义ArrayList封装一个栈数据结构:
1、定义Stack接口:
public interface Stack<E> { //查看栈元素的数量 int getSize(); //查看栈元素是否为空; boolean isEmpty(); //压栈 void push(E e); //弹出 E pop(); //查看栈顶元素 E peek(); }
2、创建自定义ArrayList
public class CustomArray<E> { //private int[] data; private E[] data; private int size; //构造函数,出入数组的容量capocity构造CustomArray public Cus