本博客内容来源自Milo Yip老师的从零开始JSON库教程,中的一个动态栈的实现。下面是链接地址:
https://zhuanlan.zhihu.com/p/22566705
因为收获颇多,故作此笔记,记录之。一个字节型的动态栈,能够实现两倍空间自动扩展(叶老师是支持1.5倍自动扩展)。下面是相关实现测试代码:
#include<iostream>
#include<assert.h>
using namespace std;
#define DEFAULT_SIZE 256
typedef struct json_context {
const char *json;
char *stack;
size_t top, size;
}json_context;
#define PUTC(c,ch) do{*(char*)(push(c,sizeof(char))=(ch);}while(0)
#define PUTS(c,s,len) memcpy(push(c,len),s,len)
void *push(json_context *c, size_t size)
{
void *ret;
if (c->top + size >= c->size) {
if (c->size == 0)
c->size = DEFAULT_SIZE;
while (c->top + size >= c->size)
c->size = c->size << 1;
c->stack = (char*)realloc(c->stack,c->size);
}
ret = c->stack + c->top;
c->top += size;
return ret;
}
void *pop(json_context *c, size_t size) {
assert(c->top>=size);
return c->stack+(c->top -= size);
}
int main()
{
json_context context;
json_context *c = &context;
c->stack = NULL;
c->top = 0;
c->size = 0;
char s[] = "hello world";
PUTS(c,s,255);
cout << c->size << endl;
cout << c->stack << endl;
system("pause");
}