链栈的进栈push和出栈pop操作都很简单,没有任何循环操作,时间复杂度均为O(1)。
    至于链栈的出栈pop操作,也是很简单的三句操作。

    • 假设变量p用来存储要删除的栈顶结点,
    • 将栈顶指针下移一位,
    • 最后释放p即可,

    如图4-6-3所示。类似于头删
    image.png
    图4-6-3

    1. /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
    2. Status Pop(LinkStack *S, SElemType *e)
    3. {
    4. LinkStackPtr p;
    5. if (StackEmpty(*S))
    6. return ERROR;
    7. *e = S->top->data;
    8. /* 将栈顶结点赋值给p,如图③ */
    9. p = S->top;
    10. /* 使得栈顶指针下移一位,指向后一结点,如图④ */
    11. S->top = S->top->next;
    12. /* 释放结点p */
    13. free(p);
    14. S->count--;
    15. return OK;
    16. }

    链栈的进栈push和出栈pop操作都很简单,没有任何循环操作,时间复杂度均为O(1)。