栈是一种后进先出的队列,和摆放盘子一样,越是后面摆放上去的先拿掉
头文件:
#ifndef stack_h
#define stack_h
#include <stdio.h>
#define stack_size(stack) ((stack)->size)
typedef struct StackElement_{
void *data;
struct StackElement_* next;
}StackElement,*StackElementP;
typedef struct Stack_{
int size;
void (*destory)(void *data);
StackElementP head;
} Stack,*StackP;
void stack_init(StackP stack,void (*destroy) (void *data));
void stack_destroy(StackP stack);
int stack_push(StackP stack,void* data);
int stack_pop(StackP stack,void **data);
void* stack_peek(StackP stack);
#endif /* stack_h */
源文件:
#include "stack.h"
#include <stdlib.h>
#include <string.h>
void stack_init(StackP stack,void (*destroy) (void *data)){
stack->destory=destroy;
stack->head=NULL;
stack->size=0;
}
void stack_destroy(StackP stack){
void *data;
while (stack_size(stack)>0) {
if(stack_pop(stack, &data)&&stack->destory!=NULL)
stack->destory(data);
}
memset(stack, 0, sizeof(Stack));
}
int stack_push(StackP stack,void* data){
StackElementP ele=malloc(sizeof(StackElement));
if(!ele)
return 0;
ele->data=data;
int size=stack_size(stack);
stack->size++;
if(size==0){
ele->next=NULL;
stack->head=ele;
}else{
ele->next=stack->head;
stack->head=ele;
}
return 1;
}
int stack_pop(StackP stack,void **data){
int size=stack_size(stack);
if(size==0)
return 0;
stack->size--;
StackElementP ele=stack->head;
stack->head=ele->next;
*data=ele->data;
free(ele);
return 1;
}
void* stack_peek(StackP stack){
StackElementP head=stack->head;
if(head)
return head->data;
return NULL;
}