java数据结构链表,堆栈,队列相关专题分析与扯谈-堆栈

继上一篇讲完链表之后,这篇开始我讲堆栈相关内容

顺序堆栈
堆栈有其线性结构和离散结构,其都有数据集合和操作集合

一、定义操作堆栈的功能接口
 (1)入栈push(obj):把数据元素obj插入堆栈。
 (2)出栈pop():出栈, 删除的数据元素由函数返回。
 (3)取栈顶数据元素getTop():取堆栈当前栈顶的数据元素并由函数返回。
(4)非空否notEmpty():若堆栈非空则函数返回true,否则函数返回false。
二、定义队列逻辑类,实现逻辑

定义功能接口Stack_,在下文链式堆栈当中同样会用到该接口

public interface Stack_ {

    /**
     * 入栈
     */
    void push(Object object) throws Exception;

    /**
     * 出桟
     */
    Object pop() throws Exception;

    /**
     * 获得桟顶元素
     */
    Object getTop() throws Exception;

    /**
     * 判断是否为空
     */
    boolean isEmpty();
}

实现顺序堆栈逻辑,当中实现接口功能stack_

/**
 * 顺序桟
 * 
 * @author robert
 *
 */
public class SequenceStack_ implements Stack_ {

    private static final int defaultsize = 10;
    public int mTop;
    int mMaxsize;
    private Object[] mStack;

    public SequenceStack_() {
        init(defaultsize);
    }

    public SequenceStack_(int size) {
        init(size);
    }

    public void init(int size) {
        this.mMaxsize = size;
        this.mTop = 0;
        mStack = new Object[size];
    }

    @Override
    public void push(Object object) throws Exception {
        // TODO Auto-generated method stub
        if (mTop == mMaxsize) {
            throw new Exception("enman");
        }
        mStack[mTop] = object;
        mTop++;
    }

    @Override
    public Object pop() throws Exception {
        if (isEmpty()) {
            throw new Exception("null");
        }
        mTop--;
        return mStack[mTop];
    }

    @Override
    public Object getTop() throws Exception {
        if (mTop == mMaxsize) {
            throw new Exception("enman");
        }
        return mStack[mTop - 1];
    }

    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return mTop == 0;
    }
}

测试类

public class Test_stack {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        SequenceStack_ stack = new SequenceStack_(10);

        Scanner in = new Scanner(System.in);
        int temp;
        for (int i = 0; i < 10; i++) {
            System.out.println("请输入第" + (i + 1) + "个整数:");
            temp = in.nextInt();
            stack.push(temp);
        }

        while (!stack.isEmpty()) {
            System.out.println(stack.pop());
        }

    }
}

结果:
这里写图片描述

链式堆栈

功能接口同样使用上文的stack_接口

抽象数据类型结点类LinkStack_Node

//结点类
public class LinkStack_Node {

    Object element; // 数据域
    LinkStack_Node next; // 指针域

    // 头结点的构造方法
    public LinkStack_Node(LinkStack_Node nextval) {
        this.next = nextval;
    }

    // 非头结点的构造方法
    public LinkStack_Node(Object obj, LinkStack_Node nextval) {
        this.element = obj;
        this.next = nextval;
    }

    // 获得当前结点的后继结点
    public LinkStack_Node getNext() {
        return this.next;
    }

    // 获得当前的数据域的值
    public Object getElement() {
        return this.element;
    }

    // 设置当前结点的指针域
    public void setNext(LinkStack_Node nextval) {
        this.next = nextval;
    }

    // 设置当前结点的数据域
    public void setElement(Object obj) {
        this.element = obj;
    }

    public String toString() {
        return this.element.toString();
    }
}

功能逻辑类的代码

/**
 * 链式桟
 * 
 * @author robert
 *
 */
public class LinkStack_ implements LStack_ {

    LinkStack_Node mhead;// 栈顶指针
    int msize;// 节点个数

    public LinkStack_() {
        this.mhead = null;
        this.msize = 0;
    }

    @Override
    public void push(Object object) throws Exception {
        mhead = new LinkStack_Node(object, mhead);
        msize++;
    }

    @Override
    public Object pop() throws Exception {
        if(isEmpty()){
            throw new Exception("null");
        }
        Object value = mhead.getElement();
        mhead = mhead.getNext();
        msize--;
        return value;
    }

    @Override
    public Object getTop() throws Exception {
        return mhead.getElement();
    }

    @Override
    public boolean isEmpty() {
        return mhead == null;
    }
}

测试类:

public class Test_LinkStack {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        LinkStack_ stack = new LinkStack_();

        Scanner in = new Scanner(System.in);
        int temp;
        for (int i = 0; i < 10; i++) {
            System.out.println("请输入第" + (i + 1) + "个整数:");
            temp = in.nextInt();
            stack.push(temp);
        }

        while (!stack.isEmpty()) {
            System.out.println(stack.pop());
        }

    }
}

结果:

这里写图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值