【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。
表1-3-1栈的操作
操作
说明
push
添加一个元素到栈的顶部(入栈)
pop
从栈的顶部移除一个元素(出栈)
peek
查看栈顶部的元素
isEmpty
判断栈是否为空
size
栈的大小(栈内元素个数)
说明:如果pop、peek的操作作用于空栈,则会抛出异常信息,同样栈满时,也应捕获这种异常信息.
细心的读者可能会发现,有没有这样一种操作:它能允许我们进入栈中去修改、删除该栈中的元素呢?答案是否定的,因为栈只能在一端进行操作(栈顶).如果需要访问集合中间或底部的元素,就不适合使用栈作为数据结构了。
1.4栈的接口定义
栈接口被定义为StackADT,表示作用于泛型T,在该接口的方法中,各个参数的返回值类型均使用泛型T来表述,在实现该接口时,将会用某种数据类型来替换泛型T。
public interface StackADT {
/**
* 往栈顶添加一个元素
* */
public void push(T element);
/**
* 从栈顶移除一个元素,并返回该元素
* */
public T pop();
/**
* 返回但不移除栈顶元素
* */
public T peek();
/**
* 判断是否为空
* */
public boolean isEmpty();
/**
* 返回栈大小
* */
public int size();
}