栈与队列可以用双链表来实现。栈就是一个 只允许头插,访问数据只允许访问头节点的下一个节点的双链表;而队列则是一个只允许尾插,访问数据同样只允许访问头节点的下一个节点(也可以实现为,只允许头插,访问数据只许访问头节点的上一个节点)。总之,实现栈的先进后处, 队列的先进先出的特性就可以。
.h文件
#pragma once
#include "dlist.h"
struct stack {
struct dlist *dlist;
void (*push)(struct stack *pstack, const void *data, size_t size);
int (*pop)(struct stack *pstack, void *dest, size_t size);
int (*top)(struct stack *pstack, void *dest, size_t size);
int (*is_empty)(struct stack *pstack);
};
int stack_init(struct stack *pstack);
int stack_destroy(struct stack *pstack);
下面是.c文件的实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "stack.h"
#include "dlist.h"
static void push(struct stack *pstack, const void *data, size_t size)
{
assert(pstack != NULL);
assert(data != NULL);
pstack->dlist->add(pstack->dlist, data, size);
}
static int is_empty(struct stack *pstack)
{
return pstack->dlist->is_empty(pstack->dlist);
}
static int top(struct stack *pstack, void *dest, size_t size)
{
if (is_empty(pstack)) {
return -1;
}
memcpy(dest, pstack->dlist->head->next->data, size);
return 0;
}
static int pop(struct stack *pstack, void *dest, size_t size)
{
if (top(pstack, dest, size) < 0) {
return -1;
}
pstack->dlist->del(pstack->dlist->head->next);
return 0;
}
int stack_init(struct stack *pstack)
{
assert(pstack != NULL);
pstack->dlist = (struct dlist *)malloc(sizeof(struct dlist));
assert(pstack->dlist != NULL);
dlist_init(stack->dlist);
pstack->push = push;
pstack->pop = pop;
pstack->top = top;
pstack->is_empty = is_empty;
return 0;
}
int stack_destroy(struct stack *pstack)
{
assert(pstack != NULL);
dlist_destroy(pstack->dlist);
free(pstack->dlist);
return 0;
}
队列的实现跟栈的区别就在与push方法的实现的时候,头插换成尾插就可以了.