栈是一种特殊的线性表,栈的插入和删除只能在表的尾端进行。栈是一种后进先出(Last In First Out)的线性表。
栈的抽象数据类型:
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() ;//删除栈顶元素
public void display();
}
栈分为顺序栈和链栈
顺序栈
顺序栈是通过数组来实现的
public class SqStack implements IStack{
private int top;//top为指向下一个存储单元的位置
private Object[] stackElem;
public SqStack(int maxSize){
top=0;
stackElem=new Object[maxSize];
}
public void clear(){
top=0;
}
public boolean isEmpty(){
return top==0;
}
public int length(){
return top;
}
public Object peek(){
if(!this.isEmpty())
return this.stackElem[top-1];
return null;
}
public void push(Object x)throws Exception{
if(top==stackElem.length)
throw new Exception("栈已满");
stackElem[top]=x;
top++;
}
public Object pop() {
if(this.isEmpty())
return null;
return stackElem[--top];
}
public void display(){
for(int i=top-1;i>=0;i--)
System.out.print(stackElem[i].toString()+" ");
System.out.println();
}
}
链栈
因为链栈不存在任意位置的插入和删除操作,所以并不需要头结点
class Node{ //结点类
public Object data;
public Node next;
public Node(){
this.data=null;
this.next=null;
}
public Node(Object data){
this.data=data;
this.next=null;
}
public Node(Object data,Node next){
this.data=data;
this.next=next;
}
}
public class LinkStack implements IStack{
private Node top;
public LinkStack(){
top=new Node();
}
public void clear(){
top=null;
}
public boolean isEmpty(){
return top==null;
}
public int length(){
int length=0;
while(top!=null){
length++;
top=top.next;
}
return length;
}
public Object peek(){
if(!this.isEmpty())
return top.data;
return null;
}
public void push(Object x){
Node p=new Node(x);
p.next=top;
top=p;
}
public Object pop(){
if(this.isEmpty())
return null;
Object p=top.data;
top=top.next;
return p;
}
public void display(){
while(top!=null){
System.out.print(top.data+" ");
top=top.next;
}
System.out.println();
}
}