我有一个任务,我应该使用这个非常简单(或者我认为)的堆栈,我的老师在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 :(得分:3)
打印时,从0
循环到(_top - 1)
,因为您的最顶层元素实际上位于_top - 1
。 提示:查看您的pop / push方法。
void print()
{
for(int i = 0; i < _top; ++i)
printf("%d ", _stk[i]);
printf("\n");
}
答案 1 :(得分:0)
&#34;问题是,rpn计算器依赖于TOS是否准确。当我执行pop()时,它会弹出0而不是真正的TOS。&#34;
听起来像是计算器实现的问题。您假设堆栈的顶部将为null,但您的教授堆栈实现并非如此。只是一个无效的假设。
相反,他提供了stk_is_empty()
方法来帮助确定您何时弹出所有内容。
如果你需要弹出所有元素,你需要打破stk_is_empty()的条件。
stk_push(2);
stk_push(4);
while( stk_is_empty() == false)
{
stk_pop();
}
当然,实际上你要将弹出回归设置为一个变量并用它做一些事情。关键点是利用stk_is_empty()
。
我几年没有编写C ++,所以希望我没有做出轻微的语法错误。