[英]Stack implemented as an array defaulting first value to 0 in C
我有一个作业,我应该使用我的老师用C语言编写的非常非常简单的堆栈(或者我认为),只是使用数组。 由此,我必须从文本文件中实现反向抛光符号。
为了实现此目的,我正在使用堆栈,将值压入直到执行操作为止。 然后,我执行该操作并将结果推回堆栈,直到用户单击p
以打印该值。
问题是由于某种原因,我的教授对堆栈数组的实现将第一个(索引0)值默认为0。在不将任何内容压入堆栈的情况下打印堆栈应为null
但看起来输出为0
。
这是我教授对堆栈的实现:
#define STK_MAX 1024
#define ELE int
ELE _stk[STK_MAX];
int _top = 0;
void stk_error(char *msg)
{
fprintf(stderr, "Error: %s\n", msg);
exit(-1);
}
int stk_is_full()
{
return _top >= STK_MAX;
}
int stk_is_empty()
{
return _top == 0;
}
void stk_push(ELE v)
{
if ( stk_is_full() )
stk_error("Push on full stack");
_stk[_top++] = v;
}
ELE stk_pop()
{
if ( stk_is_empty() )
stk_error("pop on empty stack");
return _stk[--_top];
}
void print()
{
for(int i = 0; i <= _top; ++i)
printf("%d ", _stk[i]);
printf("\n");
}
我意识到print语句将打印尚未推送的值,但是问题是,当我不打印它时,它仍然在那里结束并且最终搞砸了我的rpn计算器。 当我这样做时会发生以下情况:
// input
stk_push(2);
print();
stk_push(4);
print();
// output
2 0
2 4 0
如何摆脱影响计算器的0值? 在将第一个值压入堆栈后执行stk_pop()
似乎无效,并检查top == 0
,然后在递增_top
之前直接插入该元素无效。
在打印时,请从0
循环到(_top - 1)
,因为最顶部的元素实际上是_top - 1
。 提示 :查看您的pop / push方法。
void print()
{
for(int i = 0; i < _top; ++i)
printf("%d ", _stk[i]);
printf("\n");
}
“问题是,rpn计算器依赖于准确的TOS。但是,当我执行pop()时,它将弹出0,而不是真实的TOS。”
听起来像您的计算器实现存在问题。 您假设堆栈的顶部为空,但教授堆栈的实现并非如此。 只是一个无效的假设。
相反,他提供了stk_is_empty()
方法来帮助确定何时弹出所有内容。
如果需要弹出所有元素,则需要在stk_is_empty()的条件下中断。
stk_push(2);
stk_push(4);
while( stk_is_empty() == false)
{
stk_pop();
}
当然,实际上,您需要将pop return设置为变量并对其进行处理。 关键是利用stk_is_empty()
。
几年来我还没有写过C ++,所以希望我没有犯过轻微的语法错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.