泛型栈-C语言的简单实现
来源:互联网 发布:淘宝cnmp 编辑:程序博客网 时间:2024/04/27 11:09
头文件stack.h
#ifndef STACK_H_INCLUDED#define STACK_H_INCLUDEDtypedef struct { int elemSize; //记录所存储的类型的内存大小 int pos; //目前栈顶指针所处的位置 int allocLength; //已经分配的空间 void *elems; void (*freefn)(void*); //释放空间的函数,当所存的数据为动态分配的时候需要用到}stack;void StackNew(stack *s, int elemSize, void (*freefn)(void*));void StackDispose(stack *s);void StackPush(stack *s, void *value);void StackPop(stack *s, void *elemAddr);#endif // STACK_H_INCLUDED
栈的实现stack.cpp
#include <iostream>#include <cstring>#include "stack.h"void StackNew(stack *s, int elemSize,void (*freefn)(void*)) { //最后一个参数可以为NULL,表示不需要自定义的释放内存的函数 assert(elemSize > 0); s->elems = malloc(4 * elemSize); //默认分配四个元素空间。 s->freefn = freefn; assert(s->elems != NULL); s->elemSize = elemSize; s->pos = 0; s->allocLength = 4; //四个元素空间。}void StackDispose(stack *s) { if (s->freefn != NULL) { for (int i=0; i<s->pos; i++) { s->freefn((char*)s->elems + i * s->elemSize); } } free(s->elems); s->allocLength = 0; s->pos = 0;}static void StackGrow(stack *s) { //当空间不足是重新分配更大的空间。 assert(s != NULL); s->allocLength *= 2; s->elems = realloc(s->elems, s->allocLength);}void StackPush(stack *s, void *value) { if (s->pos >= s->allocLength) StackGrow(s); //空间不足,增大空间 void *elemAddr = (char*)s->elems + s->pos * s->elemSize; //计算栈顶指针的位置 memcpy(elemAddr, value, s->elemSize); s->pos++;}void StackPop(stack *s, void *elemAddr) { assert(elemAddr != NULL && s != NULL); s->pos--; void *tem = (char*)s->elems + s->pos * s->elemSize; //取出栈顶的元素的地址 memcpy(elemAddr, tem, s->elemSize);}
测试:
#include <stdio.h>#include "stack.h"void StrFree(void *elem) { free(*(char**)elem);}int main(){ char *base[] = {"ab","cd","ef"}; stack s; StackNew(&s,sizeof(char*),StrFree); for (int i = 0; i < 3; i++) { char *copy = strdup(base[i]); StackPush(&s,©); } char *name = (char*)malloc(10); StackPop(&s, &name); printf("%s\n",name); StackDispose(&s); return 0;}
用C语言实现泛型,比较麻烦的是,需要自己去计算地址。并且很容易编译通过,但是运行时候会出错。例如
void StrFree(void *elem) { free((char*)elem);}这样编译不会出现任何问题,也可以运行,但结果肯定不是你想要的。
- 泛型栈-C语言的简单实现
- 【C语言】C语言实现简单的链表
- 一个简单的HashMap C语言实现
- c语言实现的简单二叉树
- 一个简单的HashMap C语言实现
- C语言,简单栈的实现 Stack
- BloomFilter的一个简单实现(C语言)
- C语言实现一个简单的计算器
- C语言的HashTable简单实现
- 简单的C语言实现程序
- HashTable的简单实现(C语言)
- C语言实现的简单通讯录例子
- C语言简单的进度条实现
- C语言的HashTable简单实现
- C语言的HashTable简单实现
- 简单http_server的C语言实现
- C语言实现简单的Web服务端
- 简单的C语言赫夫曼树实现代码
- NoSQL数据库笔谈
- Java 强引用、 软引用、 弱引用、虚引用
- Java中正则表达式的使用
- X Window 程式设计入门--第三章 绘图(Graphic)
- Cannot run code from this file in conjunction with non encoded files
- 泛型栈-C语言的简单实现
- 多语境的操作
- How to send an email from oracle workflow process using an AdHocRole?
- SALVO
- X Window 程式设计入门--第四章 Event
- Win 8 文件读写操作
- Flash进制转换
- Memory Notification: Library Cache Object loaded into SGA
- Java中的软引用,弱引用和虚引用