栈是一种特殊的线性表,栈的数据节点必须后进先出。
浏览器的页面前进和后退功能就是一个典型的后进先出的场景,适合使用栈数据结构。
表尾用于输入数据,通常叫做栈顶top,表头是栈底bottom。栈顶和栈底用来表示这个站的两个指针。栈分为顺序栈和链栈。
栈的基本操作
初始时,站内没有数据,即空栈。此时栈底就是栈顶。当存入数据时,最先放入的数据进入栈底,加入的数据会被放到栈顶的位置。要删除数据也是从栈顶开始向栈底删除。对于栈的新增操作称为push或压栈,对于栈的删除操作称为pop或出栈。
顺序栈
栈的顺序储存可以借助数组来实现。一般会把数组的首元素存在栈底,最后一个元素放在栈顶。然后定义一个top指针来指示栈顶元素在数组中的位置。假设栈中只有一个数据元素,则top=0。一般以top是否为-1来判定是否为空栈。当定义了栈的最大容量为StackSize时,则栈顶top必须小于StackSize。
当需要新增数据元素,即入栈,需要把新插入元素放在栈顶,并将栈顶指针增加1
删除数据元素,即出栈,只需要top-1
查找操作也需要遍历整个栈来完成基于某些条件的数值查找。
链栈
就是用链表的方式对栈的表示。通常把栈顶放在单链表的头部。由于链栈的后进先出,原来的头指针就无用了。因此,对于链栈时不需要头指针的,但他需要增加指向栈顶的top指针。
对于链栈,需要额外处理的是栈的top指针。要插入新的数据,需要让新的节点指向原栈顶,即top指针指向的对象,再让top指针指向新的节点。
在链式栈中进行删除操作时,只能在栈顶进行操作。因此,将栈顶的top指针指向栈顶元素的next指针删除即可。
对