一、引言
栈是一种后进先出或先进后出的线性表。
二、栈
2.1栈的抽象数据类型描述
栈也是由n个数据元素所构成的有限序列,其数据元素的类型可以任意,但只要是同一种类型即可。根据栈的特性,定义在栈的抽象数据元素类型中的基本操作如下。
(1)置栈空操作clear():将一个已经存在的栈置成空栈;
(2)判栈空操作isEmpty():判断一个栈是否为空,若栈为空,则返回true;否则返回null。
(3)求栈中数据元素个数操作length():返回栈中数据元素的个数。
(4)去栈顶元素操作peek():读取栈顶元素并返回其值,若栈为空,则返回null。
(5)入栈操作push():将数据元素x压入栈顶。
(6)出栈操作pop():删除并返回栈顶元素。
栈的抽象数据类型用Java接口描述如下:
public interface IStack {
public void clear();//清空
public boolean isEmpty();//判空
public int length();//长度
public Object peek();//取栈顶元素
public void push(Object x)throws Exception;//入栈
public Object pop();//出栈
}
2.2栈的基本操作实现
top指向的是栈顶元素储存位置的下一个储存单元的位置,其值就是栈顶元素在数组中的储存位置编号加1(数组中位置的编号是从0开始),所以对于顺序栈的置空、判空、求长度、和取栈顶元素操作的实现,只要抓住以下几个关键问题,理解起来就非常简单。
(1)顺序栈为空的条件是top==0。
(2)顺序栈为满的条件是top==stackElem.length。
(3)栈的长度为top。
(4)栈顶元素就是以top-1为下标的数组元素satckElem[top-1]。
public class SqStack implements IStack {
public Object[] stackElem;//对象数组
private int top;//在非空栈中,top始终指向栈顶元素的下一个储存位置;当栈为空时,top值为0.
public SqStack(int maxSize){
top=0;//初始化top为0
stackElem=new Object[maxSize];//为栈分配maxSize个储存单位
}
public void clear() {//清空
top=0;
}
public boolean isEmpty() {//判空
return top==0;
}
@Override
public int length() {//元素个数
return top;
}
@Override
public Object peek() {//取栈顶元素
if(! isEmpty())
return stackElem[top-1];//返回栈顶元素
else
return null;
}
@Override
public void push(Object x) throws Exception {//入栈
if(top==stackElem.length)
throw new Exception("栈已满");
else
stackElem[top++]=x;//先将新的数据元素x压入栈顶,再top增1
}
@Override
public Object pop() {//出栈
if(isEmpty())//栈空
return null;
else//栈非空
return stackElem[--top];
}
public void display(){
for(int i=top-1;i>=0;i--)
System.out.print(stackElem[i].toString()+"");
}