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 の位置を使用しない理由はありますか?
どうもありがとう。