只是为了增加 ugoren 的答案(有点 OT),我认为一个相对有趣的方法可能是用一个.stack
部分扩展您的规范空间,默认情况下初始化为空(就像在您的示例中一样)。
这可以用来描述计算的预期中间阶段(在某个点保存/恢复实际状态)。
为了实现,我会使用非常简单的代码,比如
文件堆栈.h:
#ifndef STACK
#define STACK
#include <stdio.h>
/* here should be implemented the constraint about 32 bits words... */
typedef int word;
typedef struct { int top; word* mem; int allocated; } stack;
typedef stack* stackp;
stackp new_stack();
void free_stack(stackp);
void push(stackp s, word w);
word pop(stackp p);
/* extension */
stackp read(FILE*);
void write(stackp, FILE*);
#endif
文件堆栈.c:
/* example implementation, use - arbitrary - chunks of 2^N */
#include <stdlib.h>
#include "stack.h"
/* blocks are 256 words */
#define N (1 << 8)
stackp new_stack() {
stackp s = calloc(1, sizeof(stack));
s->mem = malloc((s->allocated = N) * sizeof(word));
return s;
}
void free_stack(stackp s) {
free(s->mem);
free(s);
}
void push(stackp s, int w) {
if (s->top == s->allocated) {
s->allocated += N;
s->mem = realloc(s->mem, s->allocated * sizeof(word));
}
s->mem[s->top++] = w;
}
word pop(stackp s) {
if (s->top == 0) { /* exception */ }
return s->mem[--(s->top)];
}
文件 main.c:
#include "stack.h"
int main() {
stackp s = new_stack();
word X = 3;
word Y = 5;
push(s, X);
push(s, Y);
word Z = pop(s) + pop(s);
printf("Z=%d\n", Z);
free_stack(s);
}
文件生成文件:
main: main.c stack.c
建造:
make
去测试:
./main
Z=8
值得注意的是 WRT ugoren 的回答有些不同:我强调数据隐藏,这是实现的一个有价值的部分,将有关实际功能的详细信息保存在单独的文件中。在那里我们可以添加许多细节,例如关于最大堆栈大小(实际上没有在那里强制执行)、错误处理等......
编辑:获取推送单词的“地址”
word push(stackp s, int w) {
if (s->top == s->allocated) {
s->allocated += N;
s->mem = realloc(s->mem, s->allocated * sizeof(word));
}
s->mem[s->top] = w;
return s->top++;
}