数据结构-栈的Java实现(顺序结构与链结构)

目录:

1.栈的特点

栈(stack)是限定仅仅在表尾进行插入或删除的线性表。表尾称为栈顶(top),表头端称为栈底(base)。
栈就是对日常生活中“先进后出”这一现象的抽象,能够帮助我们将许多实际问题抽象成数据结构来解决问题,比如铁路调度,递归调用的实现。
栈的图示

2.栈的抽象数据类型(ADT)

将栈的操作抽象为一个接口,规范后续的顺序栈与链栈,包括栈空的判定、栈的长度、取栈顶元素、入栈、出栈以及栈的遍历。

public interface MyStack {
    public void clearStack();
    public boolean isEmpty();
    public int stackLength();
    public ElemType getTop();
    public void push(ElemType e);
    public void pop();
    public void traverse();
}

备注:栈的数据元素,以及链栈的结点如图:
详细代码请见

数据元素和结点

3.顺序栈的实现

3.1顺序栈的存储结构与初始化

与顺序表一样,顺序栈用规定大小的ElemType数组来存储数据,存取时,以栈顶top为下标进行操作。
初始化时,调用含参构造方法,初始化以maxSize为最大长度的顺序栈。

public class SqStack implements MyStack {
    private int maxLength;//
    final private int base=0;
    private int top;
    ElemType[] stack;
    
    public SqStack(int maxSize){
    	maxLength=maxSize;
        stack=new ElemType[maxSize];
    }
    /*栈的相关方法见下文*/
}
3.2顺序栈的入栈和出栈

入栈:
在这里插入图片描述

  1. stack[top]=e;
  2. top++;

出栈:

  • top- -;(我们只关心base到top-1之间的数据,所以并不需要更改top处的值,只需要让top自减)
    在这里插入图片描述

Java代码:

    @Override
    public void push(ElemType e) {
        stack[top]=e;
        top++;
    }
    @Override
    public void pop() {
        top--;
    }
3.3顺序栈的其他方法

栈空的判断、清空栈、栈内数据的长度以及栈的遍历代码如下:

    @Override
    public void clearStack() {
        top=base;
    }

    @Override
    public boolean isEmpty() {
        return top==base;
    }

    @Override
    public int stackLength() {
        return top;
    }
    
    @Override
    public void traverse() {
        System.out.print("当前栈内元素:");
        for(int i=0;i<top;i++){
            System.out.print(stack[i]+" ");
        }
        System.out.println();
    }

4.链栈的实现

4.1链栈的存储结构与初始化

与链表一样,链栈用一个LinkNode结点来存储数据,由于出入栈都在栈顶,把链表的头结点作为栈顶比较方便。

public class LinkStack implements MyStack {
    private LinkNode linkStack;
    public LinkStack(){
        linkStack=new LinkNode();
    }
    /*栈的相关方法见下文*/
}
4.2链栈的入栈和出栈

入栈
在这里插入图片描述

出栈
在这里插入图片描述

    @Override
    public void push(ElemType e) {
        LinkNode p=new LinkNode(e);
        p.setNext(linkStack);
        linkStack=p;
    }
    
    @Override
    public void pop() {
        linkStack=linkStack.getNext();
    }
4.3链栈的其他方法

栈空的判断、清空栈、栈内数据的长度以及栈的遍历代码与链表相似,如下:

    @Override
    public void clearStack() {
        linkStack.setNext(null);
    }

    @Override
    public boolean isEmpty() {
        return linkStack.getNext()==null;
    }

    @Override
    public int stackLength() {
        LinkNode p=linkStack;
        int i;
        for(i=0;p.getNext()!=null;i++){
            p=p.getNext();
        }
        return i;
    }

    @Override
    public ElemType getTop() {
        return linkStack.getE();
    }

    @Override
    public void traverse() {
        LinkNode p=linkStack;
        System.out.print("当前栈内元素:");
        System.out.print(p.getE().toString());
        p=p.getNext();
        while(p.getNext()!=null){
            System.out.print(" -> ");
            System.out.print(p.getE().toString());
            p=p.getNext();
        }
        System.out.println();
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值