用数组实现Stack结构

上节说了Stack结构的特点,以及在java中是如何实现的。java代码中Stack实现原理

通过上面这篇文章可以知道,Stack是继承了Vector类,也就是列表,而Vector的底层结构中,其实是维护了一个数组的。

那么现在我们直接用自己写的数组类来实现一下栈的结构吧。

增强的数组Array

package com.it.data;

public class Stack<T> {
    //用于内部维护的数组
    private Array<T> arr;
    //无参构造函数
    public Stack(){
        arr = new Array<>();
    }
    //有参构造函数
    public  Stack(int capacity){
        //调用数组的构造方法
        arr = new Array<>(capacity);
    }

    /**
     * 压栈方法
     * @param t
     * @throws Exception
     */
    public void push(T t)throws Exception{
        arr.addLast(t);
    }

    /**
     * 弹栈方法
     * @return
     * @throws Exception
     */
    public T pop()throws Exception{
        T t = arr.get(arr.getSize()-1);
        arr.remove();
        return t;
    }

    /**
     * 查找栈顶元素
     * @return
     */

    public T peek() throws Exception{
        return arr.get(arr.getSize()-1);
    }

    /**
     * 查找元素对应位置
     * @param t
     * @return
     */
    public int search(T t){
        return arr.getIndex(t);
    }
}

就一样,一个简单的栈结构就基于自己写的数组结构形成了。当然,也可以不适用自己增强的数组,通过自己维护size和capacity,用最基础的数组来实现。

package com.it.data;

public class Stack2<T>{
    private T[] data;
    private int size;
    private  int incCapacity;
    public int getCapacity(){
        return data.length;
    }
    public int getSize(){
        return size;
    }
    public Stack2(){
        data = (T[])new Object[16];
    }
    public Stack2(int capacity){
        data =(T[]) new Object[capacity];
    }
    public Stack2(int capacity,int incCapacity){
        data = (T[]) new Object[capacity];
        this.incCapacity = incCapacity;
    }

    public int  push(T t){
        data[size] = t;
        size++;
        return size-1;
    }

    public T pop(){
        T t = peek();
        size--;
        return t;
    }

    public T peek(){
        return data[size-1];
    }

    public int search(T t){
        for (int i = 0; i <size ; i++) {
            if (t.equals(data[i]))
                return i;
        }
        return -1;
    }
    
}

测试自己写的栈结构:

	package com.it.data;

public class TestForStack {

    public static void main(String[] args){
        StackByArr stack = new StackByArr(10);
        stack.push(0);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        StringBuffer sb = new StringBuffer();
        System.out.println(stack.getSize());
        int size = stack.getSize();
        for (int i = 0; i <size ; i++) {
            sb.append(stack.pop());

        }
        System.out.println(sb);
        System.out.println(stack.getSize());

    }

}

运行结果为:

4
3210
0

测试成功,当然代码的健壮性还需要增强。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值