链栈本质就是操作链表。
链栈是怎么实现的呢?
通过栈顶指针top和栈底指针bottom,只要创建一个头结点,然后使得top和bottom都指向这个头结点,那么栈就被创建了,就这么简单,可以说,整个链栈的创建和操作都是通过指针来完成的。在写程序的时候,所有程序不要定义成结构体变量,而是定义成结构体指针。
需要注意的是,头结点是不存放任何数据的,只存放指向首结点的指针,同链表中一样,定义这样一个不存放数据的结点是有必要的。
程序中难免会有同时传递top和bottom的情况,这时就要传递两个参数。可以将他们封装在一个结构体里面,然后定义一个结构体指针指向他,这样只需要传递这个结构体的指针就行了。
栈是通过压栈和出栈的方式存储数据的。其中压栈是前插操作,即压栈的结点指向原来的栈顶结点,然后top指向压栈的结点,更新栈顶指针,这样就可以执行一次压栈。
如果要出栈,那么top就指向下一个结点就行了。因为top永远是指向栈顶的,所以top移动到下一个结点就相当于原来的栈顶结点被删除了。如果要销毁的话,只要循环反复的进行出栈知道栈空就可以了。记住出栈的结点要将他释放掉,不然他会一直存在内存中,造成内存泄露。而要释放掉出栈的结点就要在移动top之前先定义一个指针变量指向该结点,否则移动top之后这个结点就找不到了,因为链表不是连续的,找不到就不能将他释放掉。
从压栈和出栈可以看出,栈的操作其实就是栈顶指针来回不断的移动,这就是栈的本质,链表是不要移动头指针,而栈就是要移动头指针。
此外还需要注意的是:栈底指针是死的,是不动的,他始终都指向没有存放任何有效数据的头结点。