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