簡體   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