【Java数据结构的实现】之系列二栈的介绍
1.1本章学习目标
- 什么是栈
- 栈的特点
- 栈的接口定义
1.2什么是栈:栈的元素是按照后进先出LIFO:Last in First Out(也叫先进后出),其元素的添加和删除都是在同一端进行的,也就是说放在栈中的最后一个元素,将是第一个被移出的元素。换句话说,栈中的元素是以他们防止到栈中的相反的顺序来移除的。允许进行插入、删除的一端叫栈顶,另一段称为栈底。
栈的示意图如下:
图1.2.1
上图对应的是四个元素的入栈,顺序依次为A、B、C、D.可能会碰到的面试题如下:
①设有4个元素a、b、c、d进栈,给出它们所有可能的出栈次序。
答:所有可能的出栈次序如下:
abcd abdc acbd acdb
adcb bacd badc bcad
bcda bdca cbad cbda
cdba dcba
②已知一个栈的进栈序列是1,2,3,…,n,其输出序列是p1,p2,…,pn,若p1=n,则pi的值 。
(A) i (B) n-i
(C) n-i+1 (D) 不确定
答:当p1=n时,输出序列必是n,n-1,…,3,2,1,则有:
p2=n-1,
p3=n-2,
…,
pn=1
推断出pi=n-i+1,所以本题答案为C。
1.3栈的使用
栈的基本使用就是用于颠倒顺序,比如一个取消操作。例如文字处理程序中的取消操作,通常就是用栈来实现的,当我们对某个文档进行增加、修改、删除等操作时,文字处理程序通过把每个操作的表示压入栈(入栈)来跟踪这些操作,如果需要取消一个操作,文字处理程序会从栈中弹出最近执行的操作并退回到上一个操作,如果要再次进行取消,则再从栈中弹出另一个元素,一以此类推,来实现撤销的操作。
根据约定的术语,栈的压入称为push,出栈称为pop,查看peek。
操作 | 说明 |
push | 添加一个元素到栈的顶部(入栈) |
pop | 从栈的顶部移除一个元素(出栈) |
peek | 查看栈顶部的元素 |
isEmpty | 判断栈是否为空 |
size | 栈的大小(栈内元素个数) |
说明:如果pop、peek的操作作用于空栈,则会抛出异常信息,同样栈满时,也应捕获这种异常信息.
细心的读者可能会发现,有没有这样一种操作:它能允许我们进入栈中去修改、删除该栈中的元素呢?答案是否定的,因为栈只能在一端进行操作(栈顶).如果需要访问集合中间或底部的元素,就不适合使用栈作为数据结构了。
1.4栈的接口定义
栈接口被定义为StackADT<T>,表示作用于泛型T,在该接口的方法中,各个参数的返回值类型均使用泛型T来表述,在实现该接口时,将会用某种数据类型来替换泛型T。
- public interface StackADT<T> {
- /**
- * 往栈顶添加一个元素
- * */
- public void push(T element);
- /**
- * 从栈顶移除一个元素,并返回该元素
- * */
- public T pop();
- /**
- * 返回但不移除栈顶元素
- * */
- public T peek();
- /**
- * 判断是否为空
- * */
- public boolean isEmpty();
- /**
- * 返回栈大小
- * */
- public int size();
- }
本文转自 w156445045 51CTO博客,原文链接:http://blog.51cto.com/enetq/708360 ,如需转载请自行联系原作者