数据结构与算法之美(笔记3)栈

怎么理解栈?

关于“栈”,我有一个非常贴切的例子,就是一摞叠在一起的盘子。我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。后进者先出,先进者后出,这就是典型的“栈”结构。

如何实现数组栈?

这里就直接给出代码了,我们可以看到,入栈以及出栈的时间复杂度都是O(1)。

class arrayStack{
private:
    int* arr;
    int capacity;
    int used;
public:
    arrayStack(int size){
        arr = new int[size];
        capacity = size;
        used = 0;
    }
    void push(int elem){
        if(used >= capacity){//动态扩容
            int newArr = new int[capacity*2];
            for(int i=0;i<used;++i){
                newArr[i] = arr[i];
            }
            arr = newArr;
        }
        arr[used++] = elem;
    }

    int pop(){
        if(used == 0){
            return -1;
        }
        int temp = arr[used--];
        return temp;
    }

    void print(){
        for(int i=0;i<used;++i){
            cout << arr[i] << endl;
        }
    }
};

其实我们还可以实现动态扩容的栈,实现的思路跟之前在数组那里讲到的是一模一样的,但是需要注意他的时间复杂度分析,它的均摊时间复杂度是O(1)。

如何实现链式栈?

我们维护一个单链表,如果有数据就插入到末尾,如果删除就直接删除最后一个结点。这里由于需要找到前驱结点,所以时间复杂度都是O(n)。这里就不给出代码了。可以看之前的链表操作。

如何实现浏览器的前进与后退

问题是这样的:当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b和a。当你后退到页面a,点击前进按钮,就可以重新查看页面 b和c。但是,如果你后退到页面b后,点击了新的页面d,那就无法再通过前进,后退功能查看页面c了。

那么如何解决呢?我们使用两个栈X,Y。当我们浏览新的页面的时候,就把该数据顺序依次压入栈X。当我们点击后退按钮的时候,就把数据从X中取出来放入Y中。当我们点击前进的时候,就把数据从Y中取出来,然后再放入X中。当X中没有数据的时候,就无法前进了,当Y中没有数据的时候,就无法后退了。

假设我们顺序看了页面a,b,c,我们就依次把a,b,c,压入栈,这个时候,数据是这样的:

当你通过后退按钮的时候,从页面c,后退到页面a之后,我们就依次把c 和b从栈中弹出,并且依次放入栈Y中。

这个时候你又想看页面 b,于是你又点击前进按钮回到 b 页面,我们就把 b 再从栈 Y 中出栈,放入栈 X 中。此时两个数据是这样的:

这个时候,你通过页面b又跳转到新的页面了,页面c就无法访问了。所以需要清空栈Y。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况中应用这些数据结构。 笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份学习资料适用于所有大学计算机相关专业的学生,无论你是初学者还是已经有一定的数据结构基础。同时,对于对数据结构感兴趣的非专业人士,这份资料也是一个很好的起点。 使用建议: 结合理论和实践:在学习的过程中,请结合算法代码和理论知识。尝试自己编写代码实现数据结构,并在遇到问题时参考提供的代码。 由浅入深:建议先从基础的数据结构开始学习,如数组和链表,然后再学习更复杂的数据结构如树和图。 多做练习:数据结构是实践性很强的学科。通过多做练习,你可以更好地理解数据结构的基本概念和原理,并提高编程能力。
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况中应用这些数据结构。 笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份学习资料适用于所有大学计算机相关专业的学生,无论你是初学者还是已经有一定的数据结构基础。同时,对于对数据结构感兴趣的非专业人士,这份资料也是一个很好的起点。 使用建议: 结合理论和实践:在学习的过程中,请结合算法代码和理论知识。尝试自己编写代码实现数据结构,并在遇到问题时参考提供的代码。 由浅入深:建议先从基础的数据结构开始学习,如数组和链表,然后再学习更复杂的数据结构如树和图。 多做练习:数据结构是实践性很强的学科。通过多做练习,你可以更好地理解数据结构的基本概念和原理,并提高编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值