一、什么是栈
栈(stack)是一种先进后出的有序列表,其中的元素只能在线性表的同一端进出,
允许元素插入和删除的一端被称为栈顶(top),固定的另一端被称为栈底(button)。
二、数组简单实现栈
由于栈是只在一端进出,也就是说相比队列实际上只需要有一个栈顶指针top即可:
- 当栈空时top为-1
- 入栈后top+1
- 出栈后top-1
根据思路我们可以用数组实现一个简单的栈:
1 | /** |
三、链表简单模拟栈
数组可以比较简单的实现一个栈,但是缺点的数组随着元素的增加会需要扩容,如果初始化申请的存储空间太大,会造成空间的浪费,如果申请的存储空间太小,后期会经常需要扩充存储空间,为此我们可以用链表实现的栈来避免这个问题。
假设现有头结点,一号元素A,我们需要往里面插入或弹出B,,由于要实现“先进后出”的效果:
- 入栈时,B需要插入头结点和A之间,取代A的位置:
B.next = head.next
,也就是B指向Ahead.next = B.next
,也就是让头结点指向B
- 出栈时,B需要从头结点和A之间移除:
head.next = A
,也就是让头结点直接指向A即可
按照这个思路,我们先写一个节点类:
1 | /** |
然后简单实现一个链表栈:
1 | /** |