在Java开发中,使用Deque接口的实现类来创建栈是最常用和主流的方式之一。Deque接口根据其名字可知,Deque : double-end queue(双端队列)。众所周知,根据不同的设计方式,队列可以形成栈,栈也可组成队列,故在Deque接口中提供了用来操作队列和栈的方法,并且在其子类中进行了实现。最常用的两个实现类分别是ArrayDeque和LinkedList,第一个表示是使用数组来进行实现的双端队列,可以在两端进行元素的添加和删除操作,并且在数据量比较大的时候仍可以高效的工作。而第二个LinkedList的底层是使用双向链表来实现的,与ArrayDeque相比,它的性能略低,但是它在元素的插入和删除操作方面比较灵活。
(1)Java中栈的创建方式
① 使用Stack类
Java提供了最容易根据名字想起的Stack类,这也是在Java 6以及更早版本常用的方式。
Stack
stack.push("AAAI");
stack.push("KDD");
stack.push("SIGIR");
stack.push("WSDM");
System.out.println(stack.pop()); // 输出"WSDM",并将其从栈中移除,表明后进先出
System.out.println(stack.peek()); // 输出"SIGIR",不移除栈顶元素"SIGIR",只查看,也体现后进先出
以下是Stack类中的一类常用方法:
public class Stack
public Stack() { // 构造方法
}
public E push(E item) { // 往栈中添加元素
addElement(item);
return item;
}
public synchronized E pop() { // 移除栈顶元素, 该方法是线程安全的
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
public synchronized E peek() { // 查看栈顶元素,该方法是线程安全的
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public boolean empty() { // 判断栈空
return size() == 0;
}
}
②使用Deque接口的实现类来创建栈(推荐使用)
在Java开发中,使用Deque接口的实现类来创建栈是最常用和主流的方式之一。Deque接口根据其名字可知,Deque : double-end queue(双端队列)。众所周知,根据不同的设计方式,队列可以形成栈,栈也可组成队列,故在Deque接口中提供了用来操作队列和栈的方法,并且在其子类中进行了实现。最常用的两个实现类分别是ArrayDeque和LinkedList,第一个表示是使用数组来进行实现的双端队列,可以在两端进行元素的添加和删除操作,并且在数据量比较大的时候仍可以高效的工作。而第二个LinkedList的底层是使用双向链表来实现的,与ArrayDeque相比,它的性能略低,但是它在元素的插入和删除操作方面比较灵活。
这两种的部分用法如下所示:
ArrayDeque(栈)实现类的简单使用:public void testArrayQue(){
Deque
arrQue.push("济公");
arrQue.push("李文龙");
arrQue.push("钱掌柜");
arrQue.push("王掌柜");
arrQue.push("李管家");
String pop = arrQue.pop();
System.out.println(pop); // 输出:李管家
String peek = arrQue.peek();
System.out.println(peek); // 输出:王掌柜
System.out.println(Arrays.toString(arrQue.toArray())); // 输出:[王掌柜, 钱掌柜, 李文龙, 济公]
}
LinkedList(栈)实现类的简单使用:
public void testLinkedList(){
Deque
linkedQue.push(123);
linkedQue.push(234);
linkedQue.push(345);
linkedQue.push(456);
linkedQue.push(567);
Integer pop = linkedQue.pop();
System.out.println(pop); // 输出:567
Integer peek = linkedQue.peek();
System.out.println(peek); // 输出:456
System.out.println(linkedQue); // 输出:[456, 345, 234, 123]
}
(2)栈常见的应用场景
① 浏览器的历史记录; ② 缓存的实现;③ activity的启动模式;④ CPU中栈的实现;⑤ word自动保存;⑥ 解析计算式;⑦ 解析xml或json;⑧ 函数调用;⑨ 表达式求值