鏈表版漢諾塔問題

c++代碼

#include<iostream>

struct Node{
    int data;
    Node* next; 
};

class Stack{
  public:
    Stack(){
        top = 0;
    }
    
    ~Stack(){
        Node* next;
        while(top){
            next = top->next;
            delete top;
            top = next;
        }
    }
    
    void push(int d){
        Node* p = new Node;
        p->data = d;
        p->next = top;
        top = p;
    }
    
    int pop(){
        int d;
        Node* p = top;
        d = top->data;
        top = top->next;
        delete p;
        return d;
    }
    
    Node* top;
};

int count = 1;

Stack s[3];

void Hanoi(char A, char B, char C, int n){
    if (n == 0)
        return;
        
    int a = A - 'A';
    int c = C - 'A';
    
    Hanoi(A, C, B, n-1);
    std::cout<<count++<<":"<<A<<"->"<<C<<std::endl;
    s[c].push(s[a].pop());
    Hanoi(B, A, C, n-1);
}

int main(){
    char A, B, C;
    int n;
    std::cin>>A>>B>>C>>n;

    for(int i = n; i > 0; i--){
        s[0].push(i);
    }
    
    Hanoi(A, B, C, n);
    
    system("pause");
    return 0;
}

復雜度分析

  • 空間
    按要求利用鏈表棧實現,應為O(n)

  • 時間
    核心步驟是Hanoi函數的遞歸,次數看count即可,應為O(2^n)


有任何問題請回復提出。然后歡迎關注微信公眾號格物致愚

格物致愚
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容