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

堆栈实现为数组,在C中第一个值默认为0,c,arrays,stack,C,Arrays,Stack,我有一个作业,我应该使用我的老师用C写的这个非常简单(或者我认为是这样)的堆栈,只是使用一个数组。因此,我必须从文本文件实现反向波兰符号 为了实现这一点,我使用了一个堆栈,将值一直推到一个操作上。然后我执行操作并将结果推回到堆栈上,直到用户点击p打印值 问题是,出于某种原因,我的教授对堆栈数组的实现将第一个(索引0)值默认为0。打印堆栈而不将任何内容推到堆栈上会导致null,但输出似乎是0 下面是我的教授对堆栈的实现: #define STK_MAX 1024 #define ELE int

我有一个作业,我应该使用我的老师用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");
}

如何消除影响计算器的0值?在将第一个值推到堆栈上之后执行
stk_pop()
,并检查
top==0
,然后在递增
\u top
之前直接插入该元素似乎不起作用。

打印时,从
0
循环到
(\u top-1)
,因为你最上面的元素实际上在
\u top-1
提示:查看您的弹出/推送方法

void print()
{
    for(int i = 0; i < _top; ++i)
         printf("%d ", _stk[i]);
    printf("\n");
}
void print()
{
对于(int i=0;i<_top;++i)
printf(“%d”,_stk[i]);
printf(“\n”);
}

打印时,请从
0
循环到
(\u top-1)
,因为最上面的元素实际上位于
\u top-1
提示:查看您的弹出/推送方法

void print()
{
    for(int i = 0; i < _top; ++i)
         printf("%d ", _stk[i]);
    printf("\n");
}
void print()
{
对于(int i=0;i<_top;++i)
printf(“%d”,_stk[i]);
printf(“\n”);
}

打印时,请从
0
循环到
(\u top-1)
,因为最上面的元素实际上位于
\u top-1
提示:查看您的弹出/推送方法

void print()
{
    for(int i = 0; i < _top; ++i)
         printf("%d ", _stk[i]);
    printf("\n");
}
void print()
{
对于(int i=0;i<_top;++i)
printf(“%d”,_stk[i]);
printf(“\n”);
}

打印时,请从
0
循环到
(\u top-1)
,因为最上面的元素实际上位于
\u top-1
提示:查看您的弹出/推送方法

void print()
{
    for(int i = 0; i < _top; ++i)
         printf("%d ", _stk[i]);
    printf("\n");
}
void print()
{
对于(int i=0;i<_top;++i)
printf(“%d”,_stk[i]);
printf(“\n”);
}
“问题是,rpn计算器依赖于准确的TOS。但当我执行pop()时,它将弹出0,而不是真正的TOS。”

听起来您的计算器实现有问题。您假设堆栈的顶部为空,但堆栈实现的情况并非如此。这只是一个无效的假设

相反,他提供了一个
stk\u is\u empty()
方法来帮助确定何时弹出所有内容

如果需要弹出所有元素,则需要在stk_为_empty()的条件下中断

当然,在现实中,您会将pop返回设置为一个变量,并对其进行处理。关键点是利用
stk\u is\u empty()

我在几年内还没有编写C++,所以希望我没有犯一个小的语法错误。

< P>”问题是,RPN计算器依赖于TOS是准确的。当我做POP()时,它会弹出0而不是真正的TOS。 听起来您的计算器实现有问题。您假设堆栈的顶部为空,但堆栈实现的情况并非如此。这只是一个无效的假设

相反,他提供了一个
stk\u is\u empty()
方法来帮助确定何时弹出所有内容

如果需要弹出所有元素,则需要在stk_为_empty()的条件下中断

当然,在现实中,您会将pop返回设置为一个变量,并对其进行处理。关键点是利用
stk\u is\u empty()

我在几年内还没有编写C++,所以希望我没有犯一个小的语法错误。

< P>”问题是,RPN计算器依赖于TOS是准确的。当我做POP()时,它会弹出0而不是真正的TOS。 听起来您的计算器实现有问题。您假设堆栈的顶部为空,但堆栈实现的情况并非如此。这只是一个无效的假设

相反,他提供了一个
stk\u is\u empty()
方法来帮助确定何时弹出所有内容

如果需要弹出所有元素,则需要在stk_为_empty()的条件下中断

当然,在现实中,您会将pop返回设置为一个变量,并对其进行处理。关键点是利用
stk\u is\u empty()

我在几年内还没有编写C++,所以希望我没有犯一个小的语法错误。

< P>”问题是,RPN计算器依赖于TOS是准确的。当我做POP()时,它会弹出0而不是真正的TOS。 听起来您的计算器实现有问题。您假设堆栈的顶部为空,但堆栈实现的情况并非如此。这只是一个无效的假设

相反,他提供了一个
stk\u is\u empty()
方法来帮助确定何时弹出所有内容

如果需要弹出所有元素,则需要在stk_为_empty()的条件下中断

当然,在现实中,您会将pop返回设置为一个变量,并对其进行处理。关键点是利用
stk\u is\u empty()


我几年没有编写C++,所以希望我没有犯一个小的语法错误。

我意识到实际的顶层值是在[ST-K-Top-1 ]。问题是,rpn计算器依赖于准确的TOS。但是,当我执行pop()时,它将弹出0,而不是真正的TOS。此外,我认为您希望打印堆栈中的所有元素,而不是一次又一次地打印顶部?因此,
\u stk[i]