顺序栈

堆栈的基本概念

堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作。

堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈。

从输入和输出数据元素的位置关系看,堆栈的功能和一种火车调度装置的功能类同。

在这里插入图片描述

堆栈抽象数据类型

数据集合
堆栈的数据集合可以表示为a0,a1,…,an-1,每个数据元素的数据类型可以是任意的类类型。
操作集合
(1)入栈push(obj):把数据元素obj插入堆栈。
(2)出栈pop():出栈, 删除的数据元素由函数返回。
(3)取栈顶数据元素getTop():取堆栈当前栈顶的数据元素并由函数返回。
(4)非空否notEmpty():若堆栈非空则函数返回true,否则函数返回false。

顺序栈

顺序存储结构的堆栈称作顺序堆栈。
顺序堆栈的存储结构示意图如图所示。

在这里插入图片描述

顺序栈实现

设计Stack接口
// 栈接口
public interface Stack {
    // 入栈
    public void push(Object object) throws Exception;
    // 出栈
    public Object pop() throws Exception;
    // 获得栈顶元素
    public Object getTop() throws Exception;
    // 判断是否为空
    public boolean isEmpty();
}
实现SeqStack类
// 顺序栈
public class SequenceStack implements Stack{

    // 对象数组
    Object[] stock;
    // 栈默认长度
    final int defaultSize = 10;
    // 栈顶位置
    int top;
    // 最大长度
    int maxSize;

    public SequenceStack() {
        init(defaultSize);
    }

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

    private void init(int size) {
        this.maxSize = size;
        top = 0;
        stock = new Object[size];
    }

    @Override
    public void push(Object object) throws Exception {
        // 首先判断栈是否已满
        if (top ==  maxSize) {
            throw new Exception("堆栈已满!");
        }
        stock[top] = object;
        top++;
    }

    @Override
    public Object pop() throws Exception {
        if (isEmpty()) {
            throw new Exception("堆栈为空!");
        }
        top--;
        return stock[top];
    }

    @Override
    public Object getTop() throws Exception {
        if (isEmpty()) {
            throw new Exception("堆栈为空!");
        }
        return stock[top-1];
    }

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

Test

    public static void main(String[] args) throws Exception {
        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());
        }
    }

Java中栈与堆的区别

栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量。在java中,所有基本类型和引用类型都在栈中存储。栈中数据的生存空间一般在当前scopes内(就是由{…}括起来的区域)。
堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中。在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象。所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值