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