01 Java基本数据结构之栈实现

系列文章目录

01 Java基本数据结构之栈实现
02 Java基本数据结构之队列实现
03 Java基本数据结构之优先级队列
04 Java基本数据结构之链表


如有错误,还请指出


前言

笔者在学习了数据结构后,希望通过Java实现加深印象,如栈、队列、链表等基本结构,可网上这方面资料比较少或者带有各种个人风格不太规范的代码,零零碎碎的,对于我这个初学者而言不太友好,有些地方不是很理解,因此阅读了《Java数据结构和算法》,学习里面的基本数据结构的Java实现,并参考里面代码写下博客记录自己的学习过程。同时文章主要专注于数据结构代码的实现和理解,对于数据结构原理部分不会很详细,希望能对有同样困惑的朋友有个小小的参考。

同时对于代码部分提前做个说明,对于基本结构的Java实现书中并没有作泛型来参数化类型,但在后面链表的一个实现中,笔者使用了泛型举例,其他的实现为了方便理解都是使用了特定的数据类型的,当然这都只是一些小问题。同时强烈建议在看了整体的代码实现后,自己手敲一遍代码,这样基本结构的Java实现会在通过几次练习后逐渐掌握。


一、栈(简述)

栈只允许访问一个数据项:即最后插入的数据项。移除这个数据项后才能访问倒数第二个插入的数据项,以此类推。大部分的微处理器运用基于栈的体系结构,当待用一个方法时,把它的返回地址和参数压入栈,当方法结束返回时那些数据出栈,栈操作就嵌入在微处理器中。

为了理解栈的思想,以书中美国邮政服务为例,邮政局收到信时,会投入到一个专门的筐里,待有空闲时间的时候,从上到下处理这写堆叠的信件。当然,许多人不会生硬的遵循这种从上到下的顺序,比如,可能先拿栈底的信件;或者可以在处理信件前,改变信件的顺序马,紧急的放在最上面优先处理。如果从栈底拿信,那就是队列的结构;如果区分优先次序,那就是优先级队列,在后面的文章里都会详细叙述。
在这里插入图片描述

二、栈-数组实现

本次实现是使用数组实现的,在后面的部分,如理解了链表后,可以使用链表实现。数组实现是一种很简单同时很好理解的方式。

/*
* 01 数组实现的栈
* push 、remove、 peek 入栈、出栈、查看栈顶值
* isFull isEmpty size 判断栈满、空、大小
* */
public class StackX {
    private int maxSize;
    private int top; // 栈顶指针
    private long[] stackArray;
	
    public StackX(int maxSize) {
        this.maxSize = maxSize;
        this.top = -1;
        this.stackArray = new long[maxSize];
    }

    public void push(long item) throws Exception {
        if (isFull()) throw new Exception("栈满");
        stackArray[++top]=item;
    }
    public long remove() throws Exception {
        if (isEmpty()) throw new Exception("栈空");
        return stackArray[top--];
    }

    public long peek(){
        return stackArray[top];
    }
    public boolean isFull(){
        return top+1==maxSize;
    }
    public boolean isEmpty(){
        return top==-1;
    }
    public int size(){
        return top+1;
    }

    @Override
    public String toString() {
        return "StackX{" +
                "maxSize=" + maxSize +
                ", top=" + top +
                ", stackArray=" + Arrays.toString(stackArray) +
                '}';
    }
}

三、注意点

3.1构造方法

构造器根据参数规定的容量大小创建一个新栈,变量 top 相当于一个指针,存储栈顶元素的下标。(此时的栈是由数组实现的,因此需要定义栈的大小,如果使用链表实现,则不用实现规定。)

3.2 push() 入栈

push() 方法使 top值增加,指向栈更上面的位置,然后存储一个数据,注意 top 值是在插入数据前递增的,代码里 区分 ++i 加了再用 , i++用了再加。

3.3 remove() 出栈

返回 top 指向的数据,然后top减一。

3.4 peek() 查看栈顶元素

仅仅返回 top指向的栈顶元素,不对栈作任何改动

3.5 ifFull() isEmpty() 判断空、满

空、满判断在数据结构里是非常重要的,不管是此处栈还是后面其他结构的实现,它对增删的处理都有着巨大的影响。


测试

public class StackTest {
    public static void main(String[] args) throws Exception {
        StackX stack=new StackX(5);
        stack.push(50);
        stack.push(20);
        stack.push(30);
        System.out.println("stack.peek():"+stack.peek());
        stack.push(40);
        stack.push(10);
        System.out.println(stack);
        int j=stack.size();
        for (int i = 0; i < j; i++) {
            System.out.println(stack.remove());
        }
    }
}

/*
stack.peek():30
StackX{maxSize=5, top=4, stackArray=[50, 20, 30, 40, 10]}
10
40
30
20
50
 */
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值