结构Stack是栈的数据结构。实现栈有很多方法, 其中一种是用链表来实现。
这种方法不仅简单,而且可以使栈具有多态的特性。多态通常是面向对象语言的一种特性,它允许某种类型的对象(变量)在使用时用其他类型的对象(变量)代替。这意味着,除了使用栈本身的操作,还可以使用链表中的操作,这是因为栈本身就是一种链表,它与链表具有相同的特性。因此很多时候,可以像使用链表一样使用栈。
示例1: 栈抽象数据类型的头文件
/*stack.h*/
#ifndef STACK_H
#define STACK_H
#include <stdlib.h>
#include "list.h"
/*将堆栈作为链表实现*/
typedef List Stack;
/*公用接口*/
#define stack_init list_init /*将stack_init 定义成list_init,栈通过stack_init初始化*/
#define stack_destroy list_destroy /*将stack_destroy定义成list_destroy,栈通过stack_destroy销毁*/
int stack_push(Stack *stack,const void *data);/*栈顶压入元素*/
int stack_pop(Stack *stack,void **data); /*栈顶弹出元素*/
#define stack_peek(stack)((stack->head) == NULL ? NULL : (stack)->head->data)/*宏,获取栈顶元素数据*/
#define stack_size list_size /*宏,获取栈的大小*/
#endif
示例2: 栈抽象数据类型的实现
/*stack.c*/
#include <stdlib.h>
#include "list.h"
#include "stack.h"
int stack_push(Stack *stack,const void *data)
{
/*调用list_ins_next方法来插入指向链表头部中data的元素*/
return list_ins_next(stack,NULL,data);
}
int stack_pop(Stack *stack,void **data)
{
/*调用list_rem_next方法来删除链表的头元素*/
reurn list_rem_next(stack,NULL,data);
}