栈是什么(支持动态扩容的顺序栈、链式栈)

栈是一种’操作受限’的线性表,只允许在一端插入和删除数据,并且满足后进先出,先进后出的特性。

实际上,栈既可以用数组来实现,也可以用链表来实现,分别叫做顺序栈和链式栈。

一、如何用数组来实现一个栈 ?
/*
* 用数组实现一个栈,又称顺序栈
*/
public class ArrayStack {

    private String[] items;//数组
    private int count;//栈中元素个数
    private int n;//栈的大小


    //初始化数组,申请一个大小为n的数组空间
    private ArrayStack(int n) {
        this.items = new String[n];
        this.count = 0;
        this.n = n;
    }

    //入栈
    public boolean push(String item) {
        if (count == n) return false;
        items[count] = item;
        count++;
        return true;
    }

    //出栈,返回出栈元素
    public String pop() {
        if (count == 0) return null;
        String temp = items[count-1];
        --count;
        return temp;
    }

    //简单测试
    public static void main(String[] args) {
        ArrayStack stack = new ArrayStack(5);
        stack.push("haha");
        stack.push("hehe");
        stack.push("yaya");
        String pop = stack.pop();
        int count = stack.count;

    }
}
二、支持动态扩容的顺序栈

通过在底层依赖一个支持动态扩容的数组来实现一个可以动态扩容的顺序栈,当栈满了之后,我们就申请一个更大的数组,将原来的数据搬移到新数组中。

对于出栈操作,不涉及内存的重新申请和数据的搬移,所以出栈的时间复杂度仍是O(1),对于入栈来说情况就不一样了,当栈中有空闲空间时,入栈的操作时间复杂度是O(1),但当空间不够时,就需要重新申请内存和数据搬移,时间复杂度就变成了O(n)。

也就是说,对于入栈操作来说,最好时间复杂度时O(1),最坏情况时间复杂度时O(n)

三、如何实现浏览器的前进、后退功能 ?

我们使用两个栈X、Y来实现,首先把浏览的页面a-b-c依次压入栈X,当点击后退按钮时,再依次将c-b-a从X中出栈,并将出栈的数据依次放入栈Y中,当点击前进按钮时,再依次从Y中取出数据a-b-c,放入X中,当X中没有数据时,那就说明没有页面可以继续后退浏览了,当栈Y中没有数据,那就说明没有页面可以前进浏览了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值