1. 数据结构
利用带头结点带环的结点实现栈的相关操作.因此, 每一个结点包括了一个前驱, 一个后继, 还有一个数据成员
typedef char DLinkStackType;
typedef struct DLinkStack
{
DLinkStackType data;
struct DLinkStack* next;
struct DLinkStack* prev;
}DLinkStack;
2. 初始化
初始化即就是先给对应的结点申请一块内存, 然后将结点的数据成员置为 0 (个人所好), 然后将头结点的前驱后继依次指向空.
void DLinkStackInit(DLinkStack** stack)
{
if(stack == NULL || *stack == NULL)
{
return;//非法输入
}
*stack = (DLinkStack*)malloc(sizeof(DLinkStack));
(*stack) -> next = *stack;
(*stack) -> prev = *stack;
(*stack) -> data = 0;
}
3. 入栈
将每一个结点从链表的尾部插入,即先创建一个新结点, 然后修改新结点和最后一个结点的指向, 将新结点插入链表, 然后修改头结点和新结点的指向, 便实现了入栈操作
void DLinkStackPush(DLinkStack* stack, DLinkStackType value)
{
if(stack == NULL)
{
return;
}
DLinkStack* new_node = CreatNewNode(value);
DLinkStack* prev = stack -> prev;
prev -> next = new_node;
new_node -> prev = prev;
new_node -> next = stack;
stack -> prev = new_node;
}
4. 出栈
将每一个结点链表的尾部删除, 即修改倒数第二个结点和头结点的指向, 然后将倒数第一个结点删除, 这样便可以完成出栈
void DLinkStackPop(DLinkStack* stack)
{
if(stack == NULL)
{
return;//非法输入
}
if(stack -> next == stack)
{
return;//空栈
}
DLinkStack* to_delete = stack -> prev;
DLinkStack* prev = to_delete -> prev;
//stack vs prev
stack -> prev = prev;
prev -> next = stack;
DLinkStackNodeDestroy(to_delete);
to_delete = NULL;
}
5. 创建结点
DLinkStack* CreatNewNode(DLinkStackType value)
{
DLinkStack* new_node = (DLinkStack*)malloc(sizeof(DLinkStack));
new_node -> data = value;
new_node -> next = NULL;
new_node -> prev = NULL;
return new_node;
}
6. 取栈顶元素
每次将头结点的下一个结点的数据返回, 即就完成了取栈顶元素
int DLinkStackGetFront(DLinkStack* stack, DLinkStackType* value)
{
if(stack == NULL)
{
return -1;//非法输入
}
if(stack -> next == stack)
{
return -1;//空栈
}
*value = (stack -> prev) -> data;
return 0;
}
7. 销毁栈
从链表的第一个结点(stack -> next)开始, 依次删除每一个结点, 直到最后一个结点, 同时不要忘记将头结点(傀儡结点)也删除
void DLinkStackDestroy(DLinkStack** stack)
{
if(stack == NULL)
{
return;//非法输入
}
if((*stack) -> prev == *stack)
{
DLinkStackNodeDestroy(*stack);
*stack = NULL;
}
DLinkStack* next;
DLinkStack* to_delete;
int i = DLinkStackSize(*stack);
for(; i > 0; i--)
{
to_delete = (*stack) -> next;
next = to_delete -> next;
(*stack) -> next = next;
next -> prev = *stack;
DLinkStackNodeDestroy(to_delete);
to_delete = NULL;
}
DLinkStackNodeDestroy(*stack);
*stack = NULL;
}
如有错误,还望大家能够随时提出, 大家共同进步