栈的实现(链表方式)

来源:互联网 发布:java中转义字符 编辑:程序博客网 时间:2024/06/07 07:03

头文件(stack.h)声明了栈的结构体和基本操作的定义;

ElemType是栈里存放的数据类型,可以是int、char、结构体等等,根据自己的需求定义,但是对应的stack_traverse和stack_main_test函数要修改。

stack.h

#ifndef __STACK_H__#define __STACK_H__#define STACK_RET_OK  (int)1  #define STACK_RET_NG  (int)(-1)typedef int ElemType;//typedef char ElemType;typedef struct STACK_T {    ElemType Element;    struct STACK_T * next;}STACK;typedef struct STACK_T NODE;#define STACK_CHECK_FAIL(value)        \            do{                                             \                if(!value)                                 \                {                                             \                    printf("stack is NULLl\n");       \                    return STACK_RET_NG;        \                }                                             \            }while(0)  extern STACK * stack_init(void);extern bool stack_is_empty(STACK * stack);extern int stack_pop(STACK * stack);extern int stack_push(STACK * stack, ElemType * ele);extern ElemType stack_top(STACK * stack);extern int stack_make_empty(STACK * stack);extern int stack_traverse(STACK * stack);extern void stack_main_test(void);#endif

stack.c

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stdbool.h>#include "stack.h"STACK * stack_init(void){    STACK * stack = (STACK *)malloc(sizeof(STACK));    if(!stack)    {        printf("malloc fail\n");        return NULL;    }    memset(stack, 0, sizeof(STACK));    stack->next = NULL;    return stack;}bool stack_is_empty(STACK * stack){    return (stack->next == NULL);}int stack_pop(STACK * stack){    STACK_CHECK_FAIL(stack);    STACK * temp = NULL;    if(!stack_is_empty(stack))    {        temp = stack->next;        stack->next = stack->next->next;        free(temp);    }    else    {        printf("stack is empty\n");        return STACK_RET_NG;    }    return STACK_RET_OK;}int stack_push(STACK * stack, ElemType * ele){    STACK_CHECK_FAIL(stack);    NODE * node = (NODE *)malloc(sizeof(NODE));    memcpy(&node->Element, ele, sizeof(ElemType));    node->next = stack->next;    stack->next = node;    return STACK_RET_OK;}ElemType stack_top(STACK * stack){    STACK_CHECK_FAIL(stack);    if(!stack_is_empty(stack))    {        return stack->next->Element;    }    return (ElemType)NULL;}int stack_make_empty(STACK * stack){    STACK_CHECK_FAIL(stack);    while(!stack_is_empty(stack))    {        stack_pop(stack);    }        return STACK_RET_OK;}int stack_traverse(STACK * stack){    STACK_CHECK_FAIL(stack);    while(stack && stack->next)    {        printf("element=%d\n", stack->next->Element);        stack = stack->next;    }    return 0;}/*    下面这个是测试函数*/void stack_main_test(void){    int a=1, b=2, c=3;    STACK * stack = stack_init();    stack_push(stack, &a);    stack_push(stack, &b);    stack_push(stack, &c);    stack_pop(stack);    //stack_pop(stack);    //stack_pop(stack);    printf("top=%d\n", stack_top(stack));    stack_traverse(stack); }
0 0
原创粉丝点击