先进去的却要后出来,而后进的,反而可以先出来的数据结构——栈。

    在我们软件应用中,栈这种后进先出数据结构的应用是非常普遍的。比如你用浏览器上网时,不管什么浏览器都有一个“后退”键,你点击后可以按访问顺序的逆序加载浏览过的网页。比如你本来看着新闻好好的,突然看到一个链接说,有个可以让你年薪100万的工作,你毫不犹豫点击它,跳转进去一看,这都是啥呀,具体内容我也就不说了,骗人骗得一点水平都没有。此时你还想回去继续看新闻,就可以点击左上角的后退键。即使你从一个网页开始,连续点了几十个链接跳转,你点“后退”时,还是可以像历史倒退一样,回到之前浏览过的某个页面。

    很多类似的软件,比如Word、Photoshop等文档或图像编辑软件中,都有撤销(undo)的操作,也是用栈这种方式来实现的,当然不同的软件具体实现代码会有很大差异,不过原理其实都是一样的。

    栈(stack)是限定仅在表尾进行插入和删除操作的线性表。

    我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

    理解栈的定义需要注意:

    首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关 系。只不过它是一种特殊的线性表而已。定义中说是在线性表的表尾进 行插入和删除操作,这里表尾是指栈顶,而不是栈底。

    它的特殊之处就在于限制了这个线性表的插入和删除位置,它始终只在 栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。

    栈的插入操作,叫作进栈,也称压栈、入栈。类似子弹入弹夹,如图4-2
    -2所示。
    image.png
    栈的删除操作,叫作出栈,也有的叫作弹栈。如同弹夹中的子弹出夹,
    如图4-2-3所示。
    image.png