[英]Enqueue/Dequeue in C++ Using Pointers?
我現在開始為我的班級跳入 C++,我們在 Scheme 中介紹了入隊和出隊。 但是,我們現在用 C++ 來做,我們需要使用指針,我很難理解。 我了解什么是指針,何時使用它們等等。但是,我正在努力弄清楚如何將它們實施到這個實驗室中。 我目前有這個代碼:
#include <stdlib.h>
#include <iostream>
#include <assert.h>
using namespace std;
struct node {
int item;
node* next;
};
typedef node* nodePtr;
typedef nodePtr* queue;
queue makeQueue() {
queue q = new nodePtr[2];
q[0] = NULL;
q[1] = NULL;
return q;
}
nodePtr start(queue q) {
return q[0];
}
nodePtr tail(queue q) {
return q[1];
}
void setStart(queue q, nodePtr newNode) {
q[0] = newNode;
}
void setTail(queue q, nodePtr newNode) {
q[1] = newNode;
}
bool emptyQueue(queue q) {
return q[0] == NULL;
}
int head(queue q) {
if (emptyQueue(q)) {
cout << "Attempt to take head of an empty queue.\n";
exit(1);
}
return start(q)->item;
}
void enqueue(queue q, int newItem) {
// Answer goes here.
}
void dequeue(queue q) {
// Answer goes here.
}
對於這段代碼,我明白我需要做什么:Enqueue 將 newItem 推送到隊列的 cdr(或尾部),Dequeue 將刪除隊列開頭的節點,並相應地更新適當的位置。 但真正讓我困惑的只是指針,我不知道該怎么辦。
我將如何用指針深入編寫入隊和出隊? 我會茫然地假設入隊和出隊不應該是一行又一行的代碼。
非常感謝!
在處理基於指針的動態結構(如堆棧、鏈表和隊列)時,一切都與重新排列指針有關。 正如評論中所建議的那樣,將指針表示為紙上指向節點的箭頭將有助於形象化在入隊/出隊時如何重新分配指針。
我還想指出,您不應該像以前那樣混合使用 C 和 C++ 頭文件。 C++ 庫包括與 C 語言庫相同的定義,以相同的頭文件結構組織。 每個頭文件與 C 語言版本具有相同的名稱,但帶有“c”前綴且沒有擴展名。 例如,C 語言頭文件<stdlib.h>
的 C++ 等效項是<cstdlib>
,類似地, <assert.h>
是<cassert>
。 此外,在 C++ 中,NULL 指針是nullptr
; 使用int
和指針參數重載函數時,混合使用NULL
和nullptr
可能會導致問題。
現在到手頭的問題。 每個node
都有一個成員next
,它是指向隊列中下一個node
的箭頭。 看起來, q[0]
和q[1]
分別是指向第一個和最后一個元素的箭頭。
如果您只想從有效負載數據(而不是完整node
)中加入一個新元素,那么您必須首先動態創建node
對象。 然后它的next
指針必須指向q[0]->next
所指向的內容,而q[0]->next
必須重新分配以指向您剛剛創建的新節點:
前:
q[0]->next ---> somenode
后:
q[0]->next -. -XXX-> somenode
| ^
| |
'-> newnode->next -'
或者在 C++ 中(沒有驗證):
void enqueue(queue q, int newItem) {
nodePtr newnode = new node;
newnode->item = newItem;
newnode->next = q[0]->next;
q[0]->next = newnode;
}
出列相應地進行,看看您需要如何重新排列指針。 不要忘記delete
已刪除的節點,並提供刪除makeQueue
創建的queue
的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.