[問題] C語言的堆疊push和pop時指標移動的問題

看板C_and_CPP (C/C++)作者 (bitch不太準怎辦)時間16年前 (2010/03/26 17:09), 編輯推噓1(106)
留言7則, 2人參與, 最新討論串1/1
我看過兩種版本,內容有所不同, 一個是蘇維雅譯的Horowitz的Fundamentals of Data Structures in C 的中譯本 另一個是我之前自學C語言時買的柴田望洋寫的明?C語言教學手冊 博碩文化 Fundamentals of Data Structures in C中的內容如下: void add(int *top, element item) { /*add an item to the global stack*/ if (*top>=MAX_STACK_SIZE-1){ stack_full(); return; } stack[++*top]=item; } element delete(int *top) { /*return the top element from the stack*/ if(*top=-1) return stack_empty(); /*return an error key*/ return stack[(*top)--]; } 然後明解C語言教學手冊的堆疊程式碼範例節錄如下 /*--- 對堆疊push資料 ---*/ int StackPush(Stack *s, int x) { if (s->ptr >= s->max) /* 堆疊已經滿了 */ return (-1); s->stk[s->ptr++] = x; return (0); } /*--- 從堆疊將資料pop出來 ---*/ int StackPop(Stack *s, int *x) { if (s->ptr <= 0) /* 堆疊是空的 */ return (-1); *x = s->stk[--s->ptr]; return (0); } 這兩種一個是在push時++運算在指標之前 另一個是在指標之後 在pop時 --運算一個在指標之後,一個在指標之前 就我個人的理解在pop時應是先將top指標所指的物件值輸出,再作--運算 而push是先將top指標向前一格,再將值複製入指標所指位置,所以應該是 Horowitz的比較合理,但是實際時作明解C的程式碼之後,也沒什麼問題 而且在補習班資結題目解答中也有看過這樣的寫法,跟明解C語言的很像 void push(int element){ if(IsFull())StackFull(); stack[top++]; } void pop(){ if(IsEmpty()){StackEmpty();return-1;} element=stack[--top] } 請問為什麼這兩種寫法可以互通? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.67.195.135 ※ 編輯: Makoto0813 來自: 203.67.195.135 (03/26 17:09)

03/26 17:11, , 1F
你可以仔細看兩種寫法 前一種初始化是 -1 後一種是 0
03/26 17:11, 1F

03/26 17:11, , 2F
也就是 前一種的 stack pointer 指在資料上
03/26 17:11, 2F

03/26 17:12, , 3F
後一種的 stack pointer 指在資料下一格
03/26 17:12, 3F

03/26 17:12, , 4F
前一種的新資料放在 stack pointer 下一格
03/26 17:12, 4F

03/26 17:12, , 5F
後一種的新資料放在 stack pointer 上
03/26 17:12, 5F

03/26 17:13, , 6F
這樣再去理解它的 ++ -- 和取值的先後順序就知道為何都通了
03/26 17:13, 6F

03/26 17:19, , 7F
原來是這樣,這困擾我好久,感謝
03/26 17:19, 7F
文章代碼(AID): #1Bh7ciO3 (C_and_CPP)
文章代碼(AID): #1Bh7ciO3 (C_and_CPP)