数据结构(Java)---栈

栈是一种特殊的线性表,栈的插入和删除只能在表的尾端进行。栈是一种后进先出(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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值