标签:需要 理解 个数 不可 size 数据拷贝 并且 应该 如何
如何理解栈?
我们平时放盘子的时候,都是从下往上一个一个放,取的时候是从上往下一个一个取,不能从中间抽出。后进者先出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许从一端插入和删除。
事实上,从功能上看,数组或链表确实可以替代栈,并且操作上更加灵活,但是,在使用时就比较不可控,更容易出错。
当一个数据集合只涉及在一端的插入和删除操作,并且满足后进先出的特性,应该首选“栈”这种数据结构。
实现一个栈
栈主要包含两个操作:出栈和入栈。栈既可以用数组来实现(顺序栈),也可以用链表来实现(链式栈)。不管是顺序栈还是链式栈,入栈和出栈的过程中,空间复杂度都是O(1),时间复杂度都是O(1)。
支持动态扩容的顺序栈
当数组的空间不够时,我们就重新申请一块更大的内存,将原来数组中的数据拷贝进去,这样就实现了一个支持动态扩容的数组,所以,如果要实现一个支持动态扩容的顺序栈,我们只需要在底层依赖一个支持动态扩容的数组就可以。对于出栈,我们不会设计内存的重新申请和数据搬移,出栈的时间复杂度仍然是O(1),但是对于入栈操作来说,当空间不够时,就需要重新申请内训空间和进行数据搬移,所以时间复杂度就变成了O(n)。
标签:需要 理解 个数 不可 size 数据拷贝 并且 应该 如何
原文地址:https://www.cnblogs.com/westCastle/p/10503540.html