数据结构学习——堆栈代码
来源:互联网 发布:重庆大学软件下载 编辑:程序博客网 时间:2024/06/04 23:20
common.h
#ifndef __COMMON_H__#define __COMMON_H__#define STACK_SIZE_MAX 10typedef int SElemType;typedef struct stack_s{ SElemType *base; // stack bottom SElemType *top; // stack top int stack_size; // size of stack}STACK_S, *PSTACK_S;int stack_init(STACK_S *s);void stack_deinit(STACK_S *s);int stack_push(STACK_S *s, SElemType e);int stack_pop(STACK_S *s, SElemType *e);void stack_dump(STACK_S *s);typedef struct linkstack_s{ SElemType data; struct linkstack_s *next;}LINKSTACK_S, *PLINKSTACK_S;int linkstack_init(LINKSTACK_S **s);void linkstack_deinit(LINKSTACK_S **s);int linkstack_push(LINKSTACK_S **s, SElemType e);int linkstack_pop(LINKSTACK_S **s, SElemType *e);void linkstack_dump(LINKSTACK_S **s);#endif
顺序栈stack.c
//顺序栈#include <stdio.h>#include <stdlib.h>#include "common.h"int stack_init(STACK_S *s){ if(!s) { printf("ERR: NULL pointer.\n"); return -1; } s->base = malloc(STACK_SIZE_MAX * sizeof(SElemType)); if(!(s->base)) { printf("ERR: malloc fail\n"); return -1; } s->top = s->base; s->stack_size = STACK_SIZE_MAX; return 0;}void stack_deinit(STACK_S *s){ if(!s) { printf("ERR: NULL pointer.\n"); return; } if(!(s->base)) { printf("ERR: stack is null.\n"); return; } free(s->base); s->base = NULL;}int stack_push(STACK_S *s, SElemType e){ if(!s) { printf("ERR: NULL pointer.\n"); return -1; } /* full? */ if((s->top - s->base) == s->stack_size * sizeof(SElemType)) { printf("ERR: stack is full.\n"); return -1; } *(s->top) = e; (s->top) += sizeof(SElemType); return 0;}int stack_pop(STACK_S *s, SElemType *e){ if(!s) { printf("ERR: NULL pointer.\n"); return -1; } /* empty? */ if(s->top == s->base) { printf("ERR: stack is empty.\n"); return -1; } (s->top) -= sizeof(SElemType); *e = *(s->top); return 0;}void stack_dump(STACK_S *s){ int i; SElemType e; int used_size; if(!s) { printf("ERR: NULL pointer.\n"); return; } printf("======================================\n"); printf(" stack dump \n"); printf("======================================\n"); used_size = (s->top - s->base) / sizeof(SElemType); printf(" Used / Total : %d / %d.\n", used_size, s->stack_size); for(i = 0; i < used_size; i++) { e = *(s->base + i * sizeof(SElemType)); printf(" %02d: %d.\n", i, e); } }
链栈linkstack.c
//链栈#include <stdlib.h>#include <stdio.h>#include "common.h"int linkstack_init(LINKSTACK_S **s){ if(*s) { printf("ERR: Already exist.\n"); return -1; } *s = NULL; return 0;}void linkstack_deinit(LINKSTACK_S **s){ PLINKSTACK_S ptr; if(!(*s)) { printf("ERR: %s--> link stack not exist.\n", __func__); return; } do { ptr = (*s)->next; free(*s); *s = ptr; }while(ptr != NULL); *s = NULL;}int linkstack_push(LINKSTACK_S **s, SElemType e){ PLINKSTACK_S ptr = malloc(sizeof(LINKSTACK_S)); ptr->data = e; ptr->next = *s; *s = ptr; return 0;}int linkstack_pop(LINKSTACK_S **s, SElemType *e){ PLINKSTACK_S ptr; if(!(*s)) { printf("ERR: %s--> link stack not exist.\n", __func__); return -1; } *e = (*s)->data; ptr = (*s)->next; free(*s); *s = ptr; return 0;}void linkstack_dump(LINKSTACK_S **s){ int i = 0; PLINKSTACK_S ptr = *s; if(!(*s)) { printf("ERR: %s--> link stack not exist.\n", __func__); return; } printf("======================================\n"); printf(" linkt stack dump \n"); printf("======================================\n"); while(ptr != NULL) { printf("top - %d : %d.\n", i, ptr->data); i++; ptr = ptr->next; } printf("==========dump=end====================\n");}
一个进制转换的例子,使用栈:
/* 进制转换 */int conversion(int src, int *out, int base){ SElemType e; int n = src; STACK_S stStack; if(!out) { printf("null pointer.\n"); return -1; } stack_init(&stStack); while(n) { stack_push(&stStack, n%base); n = n/base; } stack_dump(&stStack); n = 0; while(0 == stack_pop(&stStack, &e)) { n = n*10 + e; } *out = n; return 0;}
Makefile文件:
#最终的可执行文件名TARGET = out #可执行文件依赖的所有.o文件SRCS := $(wildcard *.c)OBJECTS := $(patsubst %.c,%.o,$(SRCS))$(warning $(SRCS))$(warning $(OBJECTS))export CC = gcc export AR := arexport AS := asCFLAGS += -g -O2 -WallCFLAGS += $(INCLUDE_PATH).PHNOY: all cleanall: ${TARGET}${TARGET}: ${OBJECTS} ${CC} -o ${TARGET} ${OBJECTS} ${LIB_PATH} ${LIBS}%.o:%.c ${CC} ${CFLAGS} -c $< ${INCLUDE_PATH} clean: -rm -rf ${TARGET} ${OBJECTS}
- 数据结构学习——堆栈代码
- 数据结构——堆栈
- 数据结构——堆栈
- 数据结构笔记——堆栈
- 数据结构学习之堆栈
- 数据结构学习-堆栈
- 数据结构学习笔记之堆栈
- 数据结构学习笔记2-堆栈
- 数据结构——队列、堆栈和哈希表
- Java数据结构02堆栈——《精华》
- 简单数据结构实现——堆栈
- 数据结构归纳——队列和堆栈
- 数据结构——堆栈和队列
- 数据结构——堆栈的基本操作
- 数据结构与算法学习笔记——堆栈及其应用(10以内简单四则计算器)
- 数据结构学习——队列代码
- 学习笔记--数据结构(之一)堆栈
- 《数据结构学习总结》--表,队列,堆栈
- static_cast 的部分用法
- PLSQL developer 连接不上64位Oracle 的解决方法
- .NET实用设计模式:观察者模式(Observer)
- 《做单》读书笔记
- 程序员要经常去的104个网站
- 数据结构学习——堆栈代码
- 【视听盛宴】《电商》沃土商学院(2013.6.23)
- 迪杰斯特拉算法
- Comprehensions on Group NMF
- mysql-锁表机制分析
- Asp.net 内部对象Application
- 电脑蓝屏代码
- Leetcode: Restore IP Address
- ORA-16179: incremental changes to "log_archive_dest_1" not allowed with SPFILE