Java中栈的创建与其常见的应用场景

Java中栈的创建与其常见的应用场景

在Java开发中,使用Deque接口的实现类来创建栈是最常用和主流的方式之一。Deque接口根据其名字可知,Deque : double-end queue(双端队列)。众所周知,根据不同的设计方式,队列可以形成栈,栈也可组成队列,故在Deque接口中提供了用来操作队列和栈的方法,并且在其子类中进行了实现。最常用的两个实现类分别是ArrayDeque和LinkedList,第一个表示是使用数组来进行实现的双端队列,可以在两端进行元素的添加和删除操作,并且在数据量比较大的时候仍可以高效的工作。而第二个LinkedList的底层是使用双向链表来实现的,与ArrayDeque相比,它的性能略低,但是它在元素的插入和删除操作方面比较灵活。

(1)Java中栈的创建方式

① 使用Stack类

Java提供了最容易根据名字想起的Stack类,这也是在Java 6以及更早版本常用的方式。

Stack stack = new Stack<>(); // 创建一个栈,泛型为String,一般来讲String作为泛型是很安全的

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 extends Vector {

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 = new ArrayDeque<>();

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 = new LinkedList<>();

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;⑧ 函数调用;⑨ 表达式求值

相关推荐

巴西世界杯32强分组图(巴西世界杯排名比分表)
365bet线上官网

巴西世界杯32强分组图(巴西世界杯排名比分表)

📅 08-24 👁️ 2563
C++11 并发指南五(std::condition_variable 详解)
365足球直播无插件高清

C++11 并发指南五(std::condition_variable 详解)

📅 08-20 👁️ 2899
2025年三伏天时间表出炉!今年是“晚入伏+母伏”,看看有啥说法
如何学习英语语法:所有学生全面指南
beat365体育ios版下载

如何学习英语语法:所有学生全面指南

📅 08-21 👁️ 424
怎么取消电脑开机密码?6步搞定,跳过开机的锁链
365bet线上官网

怎么取消电脑开机密码?6步搞定,跳过开机的锁链

📅 07-26 👁️ 7493
探索Hprose:一款跨语言的轻量级RPC框架
365bet线上官网

探索Hprose:一款跨语言的轻量级RPC框架

📅 07-31 👁️ 2835
锡安为什么不打比赛
365bet线上官网

锡安为什么不打比赛

📅 08-28 👁️ 4580
2014年中国重大公共事件盘点
365足球直播无插件高清

2014年中国重大公共事件盘点

📅 08-15 👁️ 9874
卡塔尔世界杯第二轮门票抽签开启,球迷可申购一天两场球票