赞
踩
栈(stack)也被称为堆栈,是一种受限运算的线性表,是一组相同数据类型的组合。它添加和删除元素都被限制在表的一端进行(栈顶端),而另外一端则被称为栈底。
栈中的元素以后进先出(Last In First Out, LIFO)的方式进出栈,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).
栈提供了两个主要操作:进栈(push),即将某个元素添加到栈集合内;出栈(pop),即将最近添加的元素移出栈集合。此外,栈一般具有特定的容量,如果栈中添加的元素总数超过了容量,则将会导致栈处于溢出状态。
栈的实现方式主要有两种:基于数组和链表。它们都提供了统一的接口,即进栈和出栈,唯一的区别就是使用了不同的结构来存储栈元素。
(1)只能从栈的顶端存取数据
(2)数据的存取符合“后进先出”(Last In First Out, LIFO)的原则
(1)create:创建一个空栈。
(2) push:把数据存入栈顶,并返回新栈。
(3) pop:从栈顶弹出新数据,并返回新栈。
(4) IsEmpty:判断栈是否为空栈,是返回true,不是返回false。
(5) full:判断栈是否已满,是返回true,不是返回false。
首先基于数组的栈的实现方式,该方式包含的三要素分别是数组.栈顶(top)指针和栈操作集。数组用于存放元素,栈顶指针用于指引操作的位置,栈的核心操作为进栈和出栈。此外,栈存放的元素数量不能超过数组的长度。
3.1.1进栈操作
现准备对“i”“miss”“you”三个字符串分别进行进栈操作,让我们来看一下整个过程:
(1)“i”进栈后,栈顶指针top右移一个位置,指向索引为1的位置。
(2)“miss”进栈后,栈顶指针top再右移一个位置,指向索引为2的位置。
(3) “you”进栈后,栈顶指针继续向右移动一个位置,指向索引为3的位置。
3.1.2出栈操作
接着我们对栈中的元素进行两次出栈操作:
(1)“you”出栈后,栈顶指针top左移一个位置指向索引为2的位置。
(2)“miss”出栈后,栈顶指针top再左移一个位置,指向索引为1的位置。
下面我们看基于单向链表的栈的实现方式,该方式包含的三要素分别是链表结构、栈顶(top)指针以及栈操作集。链表结构用于存放元素,栈顶指针用于指引操作的位置,栈的核心操作为进栈和出栈。使用链表结构来存放栈元素可以不用担心容量的问题,而基于数组的栈所存放元素的数量则不能超过数组的长度。
初始时,栈顶指针不指向任何节点,且链表为NULL。
4.1.1进栈操作
现准备对“i”“miss”“you”三个字符串分别进行进栈操作,下面让我们来看这个过程:
(1)因为链表为NULL,所以直接创建“i”节点,且栈顶指针指向该节点。
(2)创建“miss”节点。
(3)将“miss”节点指向前一个节点,并移动栈顶指针使其指向“miss”节点。
(4)创建“you”节点,并将“you”节点指向前一个节点,并移动栈顶指针使其指向“you”节点。
4.1.2出栈操作
最后我们对栈中的元素进行两次出栈操作:
(1)取出栈顶元素“you”,然后将栈顶指针前移一位。
(2)废弃“you”节点。
(3)以此类推,第二次出栈操作先取出“miss”节点,然后将栈顶指针前移一位并废弃“miss”节点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。