栈的实现(链表方式)
来源:互联网 发布: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
- 栈的实现(链表方式)
- 队列的实现(链表方式)
- 栈的两种实现方式:数组和链表
- 链表的底层实现方式
- 栈的实现(数组方式)
- java实现栈(链表方式)
- 字符串数据结构实现(链表方式)
- 链表反转的递归和非递归实现方式
- 链表反转的递归和非递归实现方式
- 队列-C语言-链表的实现方式
- 线性表的顺序方式实现(c语言)
- 顺序表-Class方式的实现(头文件)
- 栈01:实现栈的3中方式: 数组,链表和容器
- 队列(二)——队列的链表实现方式
- 以链表的方式实现队列(入列和出列)
- 栈的三种存储实现方式
- Java栈数据结构的实现方式
- 六、栈的实现两种方式
- Invert Binary Tree
- C - 开门人和关门人(结构体+sort)
- 栈的实现(数组方式)
- 正则表达式
- 微信、QQ这类IM App怎么做——谈谈Websocket
- 栈的实现(链表方式)
- D - EXCEL排序(sort+结构体)
- 栈的应用---平衡符号
- Swap Nodes in Pairs
- 10个团队管理励志小故事及感悟
- E - 稳定排序(sort+结构体)
- iOS 第三方资源篇
- Codeforces Round #363 (Div. 2) C. Vacations(DP 动态规划)
- [Cloud Computing]Mechanisms: Orchestration Engine