栈是一种特殊的线性表,栈中的数据元素以及数据元素间的逻辑关系与线性表相同,两者区别在于:线性表的插入和删除操作可以在表的任意位置进行,而栈的插入和删除操作只允许在表的尾端进行。其中,允许进行插入删除操作的叫做栈顶、另一端叫做栈底。因此,栈又称为先进后出的线性表(LIFO)。因为栈是一种特殊的线性表,所以根据存储结构也可以把栈分为顺序(顺序存储结构)栈和链(链式存储结构)栈。定义栈接口代码如下:
public interface IStack {
public void clear(); //将一个已经存在的栈置为空栈
public boolean isEmpty(); //判断一个栈是否为空
public int length(); //返回栈中数据元素的个数
public Object peek(); //读取栈顶的元素,若栈为空,返回null
public void push(Object x) throws Exception; //将数据元素压入栈
public Object pop(); //删除并返回栈顶元素
}
顺序栈:与顺序表一样,顺序栈也可以使用数组来进行实现。由于入栈和出栈都只能在栈顶进行,因此我们加上一个top变量来指示栈顶元素。代码如下:
public class SqIStack implements IStack{
private Object[] listItem; //定义数组,用来存放数据元素
private int top; //在非空栈中,top始终指向栈顶元素的下一个存储位置,当栈为空时,top的值为0
public SqIStack(int maxsize){
top=0; //初始化为top为0
listItem=new Object[maxsize]; //为栈分配maxsize个存储单元
}
@Override
public void clear() {
// TODO Auto-generated method stub
top=0;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return top==0;
}
@Override
public int length() {
// TODO Auto-generated method stub
return top;
}
@Override
public Object peek() {
// TODO Auto-generated method stub
if(top!=0){
return listItem[top-1];
}else {
return null;
}
}
@Override
public void push(Object x) throws Exception {
// TODO Auto-generated method stub
if(top==listItem.length){
throw new Exception("栈已满");
}else{
listItem[top++]=x;
}
}
@Override
public Object pop() {
// TODO Auto-generated method stub
if(isEmpty()){
return null;
}else{
return listItem[--top];
}
}
}
链栈的操作:由于在栈中,入栈和出栈操作只能在栈顶进行,不存在在单链表的任意位置进行插入和删除操作的情况,所以在栈中不需要设置头结点,直接将栈顶元素放在单链表的首部称为首结点。而只需要设置一个top指向栈顶元素结点即可。
public class Node {
public Object data; //存放节点值
public Node next; //后继节点的引用
public Node(){ //无参数的构造器
this(null,null);
}
public Node(Object data){ //带一个参数时的构造函数
this(data,null);
}
public Node(Object data,Node next){ //两个参数时的构造函数
this.data=data;
this.next=next;
}
}
public class LinkStack implements IStack{
public Node top;
@Override
public void clear() {
// TODO Auto-generated method stub
top=null;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return top==null;
}
@Override
public int length() {
// TODO Auto-generated method stub
Node pNode=top;
int lenth=0;
while(pNode!=null){
pNode=pNode.next;
lenth++;
}
return lenth;
}
@Override
public Object peek() {
// TODO Auto-generated method stub
if(top!=null){
return top.data;
}else
return null;
}
@Override
public void push(Object x) throws Exception {
// TODO Auto-generated method stub
Node p=new Node(x); //构造新结点
p.next=top.next; //新结点称为栈顶结点
top=p;
}
@Override
public Object pop() {
// TODO Auto-generated method stub
if(top==null){
return null;
}else{
Node p=top;
top=top.next;
return p.data;
}
}
}