假设链式栈的初始状态如下:
头结点 (top) -> 节点A -> 节点B -> 节点C -> NULL
步骤 1:检查栈是否为空
检查 top->next
是否为 NULL
。如果 top->next == NULL
,说明栈为空,无法出栈。
-
示意图:
头结点 (top) -> NULL
如果栈为空,直接返回
0
,并输出提示信息。
步骤 2:栈不为空时的操作
假设栈不为空,栈结构如下:
头结点 (top) -> 节点A -> 节点B -> 节点C -> NULL
步骤 2.1:保存栈顶节点 创建一个临时指针 temp
,并将其指向栈顶节点(即 top->next
)。
-
示意图:
头结点 (top) -> 节点A -> 节点B -> 节点C -> NULL ^ | temp
步骤 2.2:获取栈顶元素的值 将栈顶节点的 data
值赋给传入的变量 e
。
-
示意图:
头结点 (top) -> 节点A -> 节点B -> 节点C -> NULL ^ | temp
假设节点A的
data
值为50
,则*e = 50
。
步骤 2.3:更新栈顶指针 将头结点的 next
指针更新为栈顶节点的下一个节点(即 temp->next
)。
-
示意图:
头结点 (top) -> 节点B -> 节点C -> NULL
步骤 2.4:释放栈顶节点的内存 释放临时指针 temp
所指向的节点的内存。
-
示意图:
头结点 (top) -> 节点B -> 节点C -> NULL
步骤 2.5:返回成功标志
返回 1
,表示出栈成功。
文字模拟图
以下是文字模拟的链式栈出栈过程:
初始状态:
头结点 (top) -> 节点A -> 节点B -> 节点C -> NULL
保存栈顶节点:
头结点 (top) -> 节点A -> 节点B -> 节点C -> NULL
^
|
temp
更新栈顶指针:
头结点 (top) -> 节点B -> 节点C -> NULL
释放栈顶节点:
头结点 (top) -> 节点B -> 节点C -> NULL
最终状态:
头结点 (top) -> 节点B -> 节点C -> NULL
简单明了的总结
-
检查栈是否为空:
-
如果
top->next == NULL
,返回0
,栈为空。
-
-
保存栈顶节点:
-
NODE *temp = top->next;
-
-
获取栈顶元素的值:
-
*e = temp->data;
-
-
更新栈顶指针:
-
top->next = temp->next;
-
-
释放栈顶节点的内存:
-
free(temp);
-
-
返回成功标志:
-
返回
1
,出栈成功。
-