一、什么是栈? 1.后进者先出,先进者后出,这就是典型的“栈”结构。 2.从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。 二、为什么需要栈? 1.栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。 2.但,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。 3.所以,当某个数据集合只涉及在某端插入和删除数据,且满足后进者先出,先进者后出的操作特性时,我们应该首选栈这种数据结构。 三、如何实现栈? 1.栈的API public class Stack<Item> { //压栈 public void push(Item item){} //弹栈 public Item pop(){} //是否为空 public boolean isEmpty(){} //栈中数据的数量 public int size(){} //返回栈中最近添加的元素而不删除它 public Item peek(){} } 2.数组实现(自动扩容) 时间复杂度分析:根据均摊复杂度的定义,可以得数组实现(自动扩容)符合大多数情况是O(1)级别复杂度,个别情况是O(n)级别复杂度,比如自动扩容时,会进行完整数据的拷贝。 空间复杂度分析:在入栈和出栈的过程中,只需要一两个临时变量存储空间,所以O(1)级别。我们说空间复杂度的时候,是指除了原本的数据存储空间外,算法运行还需要额外的存储空间。 实现代码:(见另一条留言)