簡體   English   中英

使用指針在 C++ 中入隊/出隊?

[英]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和指針參數重載函數時,混合使用NULLnullptr可能會導致問題。

現在到手頭的問題。 每個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM