Java之栈

Java当中给我们提供了一系列的栈的使用方法,

方法功能
Stack()构造一个空的栈
E push(E e)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检测栈是否为空

其中pop()会将栈顶元素取出后删除,但peek()只获取栈顶元素 不会删除

那么我们是否可以将栈给模拟实现呢?
在实现栈的基本操作时,要定义好栈内的成员变量,

1. 栈内成员

public class MyStack {
    int usedSize;//栈内有效数据个数
    int[] elme;//栈的底层是用数组实现的,所以用数组来存放栈内成员
    
    //给定一个构造方法,初始化栈容量为10
    public MyStack(int[] elme) {
        elme= new int [10];
    }
}

在定义了栈内的成员变量后,我们可以来编写成员方法来实现栈的基本操作了

2. 入栈

 public void push(int data){
        elme[usedSize]=data;
    }

3. 出栈

public int pop(){
        int oldval=elme[usedSize-1];
        usedSize--;
        return oldval;
    }

4. 取栈顶元素

    public int peek(){
        return elme[usedSize-1];
    }

5. 栈的扩容

public void ensureCapacity(){
        if(usedSize==elme.length){
            elme= Arrays.copyOf(elme,usedSize*2);
        }
    }

模拟实现栈后,我们来思考一个问题??
根据
栈的特点 先进后出

我们可以得到栈无论是取栈顶元素还是入栈,时间复杂度都是O(1).
我们思考能否使用链表来实现栈呢??

1.若用单链表实现栈,那么栈的头插,去头节点元素时间复杂度O(1),尾插,取尾节点元素时间复杂度O(n)
2.若使用双向链表实现栈,头插,去头节点元素,尾插,取尾节点元素时间复杂度O(1)

所有在使用链表实现栈时,我们更推荐使用双向链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值