栈的链表实现与数组实现原理差不多,只要熟悉链表的操作就能快速写出来。不过链表实现不需要考虑栈满的问题,因为栈的大小完全由你压栈决定。当然malloc申请的内存空间是有限的,超过了这个空间也不行。下面我讲一些创建空栈,压栈,出栈操作。
1、创建空栈
首先考虑,栈顶指针压栈的时候到底是往链表下端增加,还是往上增加。若往下增长,那么在出栈的时候,就无法实现,因为栈顶指针指向的是尾结点,单向链表是不能访问上一个结点的,除非是双向链表。为方便压栈、出栈的操作,所以创建带有头结点的空栈。
/*
** 创建带有头结点的空栈
*/
Stack Create_Stack()
{
Stack S = (Stack) malloc(sizeof(struct SNode));
S->next = NULL;
return S;
}
2、压栈
压栈操作,实际上是将新结点插入到栈顶下方。
void Push(Stack S, int X)
{
Stack T = (Stack)malloc(sizeof(struct SNode));
T->Data = X;
T->next = S->next; /* 栈顶头结点S想上移动 */
S->next = T;
}
3、出栈
出栈操作,实际上是删除栈顶下方结点。
/*
** 出栈
*/
int Pop(Stack S)
{
Stack t &