繁体   English   中英

堆栈实现为数组,默认情况下C中的第一个值为0

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM