堆栈实现为数组,在C中将第一个值默认为0

时间:2015-02-05 23:01:59

标签: c arrays stack

我有一个任务,我应该使用这个非常简单(或者我认为)的堆栈,我的老师在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之前直接插入该元素不起作用。

2 个答案:

答案 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 ++,所以希望我没有做出轻微的语法错误。