复杂的通用堆栈

标签 c types stack ansi-c

我被指派用 ANSI C 编写通用堆栈。它适用于原始数据类型。到这里为止,还没有出现任何大问题。

之后,我被要求重新编程我的应用程序,以便即使是复杂的数据类型也可以在我的堆栈上使用。我上周进行了搜索和研究,但没有发现任何有帮助的内容。

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stddef.h>
#include "genstacklib.h"
void (*freefn) (void*);

/*
 * ToDo
 */
void GenStackNew(genStack *s, int elemSize, void (*freefunk) (void*))
{
    s->elems = malloc (elemSize * GenStackInitialAllocationSize);
    freefn = freefunk;
    assert (s->elems != NULL);
    s->elemSize = elemSize;
    s->logLength = 0;
    s->allocLength = GenStackInitialAllocationSize;
}
/* 
 * ULStackPush adds an element to the stack and allocates new memory if
 * needed. If there is not enough memory, ULStackPush does nothing.
 */
void GenStackPush (genStack *s, const void *elemAddr)
{
    /*assert (sizeof(*elemAddr) == s->elemSize);*/
    assert (s->elems != NULL);

    if (s->logLength == s->allocLength)
    {
        void *temp = NULL;

        temp = realloc (s->elems, 2 * s->allocLength * s->elemSize);
        assert (temp != NULL);
        s->allocLength = 2 * s->allocLength;
        s->elems = temp;
    }
    memcpy(currentval(s), elemAddr, s->elemSize);
    s->logLength = s->logLength + 1;
}

void GenStackPop (genStack *s, const void *elemAddr)
{
    assert (s->elems != NULL);
    assert (s->logLength != 0);
    (s->logLength)--;
    memcpy((void *)elemAddr, currentval(s), s->elemSize);
}

void *currentval(genStack *s)
{
    assert (s->elems != NULL);
    return ((size_t*)s->elems + s->logLength * s->elemSize);
}

bool GenStackEmpty (const genStack *s)
{
    assert (s->elems != NULL);
    return s->logLength == 0;
}

void GenStackDispose (genStack *s)
{
    assert (s->elems != NULL);
    s->logLength = 0;
    free (s->elems);
    freefn();
}
/*
 * ToDO
 */
void *freefn (void *) {
    free 

我的标题数据是:

#ifndef GENSTACKLIB_H
#define GENSTACKLIB_H

#include <stdbool.h>
#define GenStackInitialAllocationSize 4

typedef struct
{
  void *elems;
  int elemSize;
  int logLength;
  int allocLength;
} genStack;

void GenStackNew (genStack * s, int elemSize);
bool GenStackEmpty (const genStack * s);
void GenStackPush (genStack * s, const void *elemAddr);
void GenStackPop (genStack * s, const void *elemAddr);
void GenStackDispose (genStack * s);
void *currentval(genStack *s);
#endif

在第一个代码块中,我相信必须做的事情是在 ToDo 标记中。 如何才能将我的堆栈用于复杂的数据类型?

提前致谢

最佳答案

我没有看到像字符串这样的“复杂”类型有任何问题...指向字符串的指针和指向 int 的指针之间没有真正的区别。因此,只需存储指针(或指向指针的指针)就可以了。

所以元素不是“int”..元素是指向指针的指针。

非常“伪”C 代码形式的基本思想

typedef struct Wrapper 
{
 void * primitiveData;
} Wrapper;


void PrimitivePush(void * data)
{
 Wrapper * w = malloc();
 w->primitiveData = malloc();
 memcpy(w->primitiveData, data);

 ClassicComplexTypePush(&w)
}

ClassicComplexTypePush(void ** data)
{
  push data to stack
}

关于复杂的通用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23242049/

相关文章:

C Shell 执行命令

dynamic - Clojure 是单类型的吗?

c++ - 如何检查两个堆栈在 C++ 中是否相同?

C++ LIFO 队列,从 FIFO 到 LIFO 的简单示例

c - 我应该把大数组放在栈上还是堆上?

用于编译测试的 CMake 和 CMocka 标准断言

用C创建客户端: does not connect to the server

c - 为什么这些变量明显改变了类型?

c++ - 为什么C++(Visual Studio)数据类型没有停止在其极限上?

java - 如何基于堆栈等自定义数据结构创建 ObservableList