顺序表和链表实现栈,二者相辅相成,很难说那个更好。
1.栈结构体的声明
先定义链表结构体,在定义栈结构体
typedef struct LTNode{
DataType data;
LTNode* next;
}LTNode;
typedef strcut Stack{
LTNode* head;//指向栈顶
size_t size;//栈内元素的个数
}Stack;
2.栈的初始化
void StackInit(Stack* ps)
{
ps->head = NULL;
ps->size = 0;
}
3.栈的销毁
void StackDestory(Stack* ps)
{
while(ps->head)
{
LTNode* next = ps->head->next;//定义一个链表指针,指向要释放的下一个节点
free(ps->head);
ps->head = next;
}
ps->size = 0;
}
4.入栈
void StackPush(Stack* ps, DataType x)
{
LTNode* new_node = (LTNode*)malloc(sizeof(LTNode));//创建一个新的链表节点
new_node->data = x;
new_node->next = ps->head;//新节点的下一个指向栈顶节点
ps->head = new_node;//更新栈顶
ps->size++;
}
5.出栈
DataType StackPop(Stack* ps)
{
assert(ps->head);
LTNode* stack_head = ps->head;
LTNode* next = ps->head->next;
free(ps->head);
ps->head = next;
ps->size--;
return stack_head->data;
}