什么是栈
栈(Stack)是一种特殊的线性表,它只能在表尾进行插入和删除操作,就像下面这样:

我们一般只在一端进行插入和删除,依次插入1,2,3,4后,如果进行删除操作,将会是4,3,2,1的顺序进行删除:

底部称为栈底,顶部成为栈顶,所有操作只能在栈顶进行,先进后出,下面的元素想要进行操作需要让上面的元素先出去
接着我们要来讲下栈的两个操作:
- pop:出栈操作,从栈顶取出一个元素。
- push:入栈操作,向栈中压入一个新的元素。
我们先按照顺序表(也可以用链表)来编写:
1 | typedef int E; |
接着我们需要一个初始化方法:
1 | _Bool initStack(ArrayStack stack){ |
1 | int main(){ |
顺序栈的操作:
入栈操作
1 | _Bool pushStack(ArrayStack stack, E element){ |
入栈只能在尾部插入:
1 | _Bool pushStack(ArrayStack stack, E element){ |
打印栈中元素:
1 | void printStack(ArrayStack stack){ |
但是我们此时此刻要面临着一个问题,就是该顺序栈可能会被塞满,所以我们可以添加扩容操作:
1 | _Bool pushStack(ArrayStack stack, E element){ |
出栈操作
出栈操作比较简单,只需要输出当前栈顶元素即可;
1 | _Bool isEmpty(ArrayStack stack){ //在出栈之前,我们还需要使用isEmpty判断一下栈是否为空,空栈元素都没有出个毛 |
单链栈的操作
前面我们演示了使用顺序表实现栈,我们接着来看如何使用链表来实现栈,实际上使用链表会更加的方便,我们可以直接将头结点指向栈顶结点,而栈顶结点连接后续的栈内结点:

1 | typedef int E; |
入栈操作
当有新的元素入栈,只需要在链表头部插入新的结点即可,我们来尝试编写一下
接着我们来编写一下入栈操作:

1 | _Bool pushStack(Node head, E element){ |
出栈操作
同理得,移除第一个结点:
1 | _Bool isEmpty(Node head){ |
说些什么吧!