链栈的进栈push和出栈pop操作都很简单,没有任何循环操作,时间复杂度均为O(1)。
至于链栈的出栈pop操作,也是很简单的三句操作。
- 假设变量p用来存储要删除的栈顶结点,
- 将栈顶指针下移一位,
- 最后释放p即可,
如图4-6-3所示。类似于头删
图4-6-3
/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(LinkStack *S, SElemType *e)
{
LinkStackPtr p;
if (StackEmpty(*S))
return ERROR;
*e = S->top->data;
/* 将栈顶结点赋值给p,如图③ */
p = S->top;
/* 使得栈顶指针下移一位,指向后一结点,如图④ */
S->top = S->top->next;
/* 释放结点p */
free(p);
S->count--;
return OK;
}
链栈的进栈push和出栈pop操作都很简单,没有任何循环操作,时间复杂度均为O(1)。