学习笔记:数据结构(二)栈与队列

来源:互联网 发布:储存卡损坏数据恢复 编辑:程序博客网 时间:2024/05/16 19:22

        栈与队列可以用双链表来实现。栈就是一个 只允许头插,访问数据只允许访问头节点的下一个节点的双链表;而队列则是一个只允许尾插,访问数据同样只允许访问头节点的下一个节点(也可以实现为,只允许头插,访问数据只许访问头节点的上一个节点)。总之,实现栈的先进后处, 队列的先进先出的特性就可以。


.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方法的实现的时候,头插换成尾插就可以了.

0 0
原创粉丝点击