我正在阅读 Herbert Schildt 的 C++ 参考书,本书的 c 部分有一个堆栈示例,类似于以下内容:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 50
void push(int i);
int pop(void);
int *tos, *p, stack[SIZE];
int main(void) {
tos = stack;
p = stack;
// push, pop, etc
return 0;
}
void push(int i) {
p++;
if (p==(tos+SIZE)) {
printf("Stack overflow");
exit(1);
}
*p = i;
}
int pop(void) {
if (p==tos) {
printf("Stack Underflow");
exit(1);
}
p--;
return *(p+1);
}
上面的堆栈实现不使用 TOS 来存储值。第一个值存储在 TOS+1。我不明白您为什么要这样做,因为它似乎浪费了内存空间。
我已将其重写为下面的示例,这不会浪费空间(编辑:阅读所选答案 - 下面的代码是可疑的!):
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
void push(int i);
int pop(void);
int *tos, *p, stack[SIZE];
int main(void) {
tos = stack;
p = stack;
// push, pop, etc
return 0;
}
void push(int i) {
if (p==(tos+SIZE)) {
printf("Stack overflow");
exit(1);
}
*p = i;
p++;
}
int pop(void) {
p--;
if (p<tos) {
printf("Stack Underflow");
exit(1);
}
return *p;
}
Schildt 的实施是否有理由不使用 TOS 位置?
非常感谢。