Hanoi塔問題 棧與遞迴C語言程式設計實現
Hanoi塔 棧與遞迴C程式設計實現
參考書 嚴蔚敏 資料結構
#include <stdio.h> #include <stdlib.h> #include <conio.h> typedef int ElemType; typedef int Status; #define STACK_SIZE 10 #define STACK_INCREMENT 10 #define OK 1 #define ERROR -1 typedef struct{ ElemType *base; ElemType *top; int stacksize; char tag; }Stack; Status InitStack(Stack &S,char tag) { S.base=(ElemType*)malloc(STACK_SIZE*sizeof(ElemType)); if (!S.base) return ERROR; S.top=S.base; S.tag=tag; S.stacksize=STACK_SIZE; return OK; } Status Pop(Stack &S,ElemType &e) { if (S.base==S.top)//判斷是否非空 return ERROR; S.top--;//棧頂元素降低 e=*S.top;//輸出 return OK; } Status Push(Stack &S,ElemType e) { if ((S.top-S.base)>=S.stacksize)//棧滿追加資料元素 { S.base=(ElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(ElemType)); //指標名=(資料型別*)realloc(要改變記憶體大小的指標名,新的大小)。//新的大小一定要大於原來的大小不然的話會導致資料丟失! if (!S.base) exit(ERROR); S.top=S.base+S.stacksize; S.stacksize+=STACK_INCREMENT; } *S.top=e; S.top++; return OK; } Status StackEmpty(Stack &S) { if (S.base==S.top) return 1; else return 0; } int c=0;//全域性變數記錄搬運次數 void Move(Stack &x,ElemType n,Stack &z) { Pop(x,n); Push(z,n); } void hanoi(ElemType n,Stack &x,Stack &y,Stack &z) { printf("%d:Move disk %d from %c to %c\n",++c,n,x.tag,z.tag); if (n==1) Move(x,1,z); else { hanoi(n-1,x,z,y);//將x上編號為1至n-1的圓盤移到y,z作為補助塔 Move(x,n,z);//將編號為n的圓盤從x移到z hanoi(n-1,y,x,z);//將y上編號為1至n-1的圓盤移到z,x作為補助塔 } } void main() { int n; Stack x,y,z; char tagx='x';//給棧打標籤 char tagy='y';//給棧打標籤 char tagz='z';//給棧打標籤 ElemType e; InitStack(x,tagx); InitStack(y,tagy); InitStack(z,tagz); printf("請輸入Hanoi塔的高度\n"); scanf("%d",&n); hanoi(n,x,y,z); printf("搬運結束,輸入羅漢塔Z:\n"); while(!StackEmpty(z)) { Pop(z,e); printf("%d\n",e); } getch(); }
輸入塔高3
輸出
請輸入Hanoi塔的高度
3
1:Move disk 3 from x to z
2:Move disk 2 from x to y
3:Move disk 1 from x to z
4:Move disk 1 from z to y
5:Move disk 2 from y to z
6:Move disk 1 from y to x
7:Move disk 1 from x to z
搬運結束,輸入羅漢塔Z:
1
2
3
相關推薦
Hanoi塔問題 棧與遞迴C語言程式設計實現
Hanoi塔 棧與遞迴C程式設計實現 參考書 嚴蔚敏 資料結構 #include <stdio.h> #include <stdlib.h> #include <conio.h> typedef int ElemType; type
漢諾塔遞迴C語言程式碼實現
#include <stdio.h> int c=0; void move(int disk,char start,char end) { printf("step:%d,move
資料結構中棧與佇列的c語言程式碼實現
用一個簡單的c語言例子,用程式碼實現棧與佇列的各種程式碼。 進位制轉換 十進位制N和其他d進位制數的轉換原理: N=( N div d )*d + N mod d 其中:div為整除運算,mod為求餘運算 例如:(1348)10=(25
資料結構:棧與遞迴(Hanoi塔問題)
void Hanoi( int n, char a, char b, char c ) { if ( n == 1 ) { cout << "第" << n <
演算法導論 之 平衡二叉樹 - 建立 插入 查詢 銷燬 - 遞迴 C語言
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
演算法導論 之 平衡二叉樹 - 刪除 - 遞迴 C語言
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
漢諾(Hanoi)塔問題的遞迴解決
漢諾塔問題: 古代有一個塔,塔內有3個座A、B、C,開始時A座有64個盤子,盤子大小不相等,大的在下,小的在上。有一個老和尚想把這64個盤子從A座移動到C座,但每次只允許移動一個盤,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動過程中可以利用B座,
《演算法圖解》 | 深入理解棧與遞迴
1.如何理解遞迴? 遞迴是一種全新的思維方式,初學遞迴總會有知其然卻不知其所以然的感覺,這裡我們可以從迴圈入手,探討遞迴與迴圈的內在差別。 理論上:所有的遞迴都可以用迴圈實現,但實際上有的演算法因為迴圈次數過多,很難轉換。(如:漢諾塔問題)。 我們先來假設這樣一個場景
N皇后問題-回溯與遞迴-C++實現
問題描述:N皇后問題是一個古老而著名的問題,是回溯演算法的典型案例。該問題由西洋棋棋手馬克斯·貝瑟爾於1848年提出。在國際象棋上,N皇后問題變成了8皇后問題,著名的數學家高斯認為有76種方案,後來有人用圖論的知識解出92種結果,計算機發明後,可以通過演算法實現問題的求解。顯
演算法:漢諾塔(棧的遞迴呼叫)-資料結構(9)
一、問題描述 參見網上漢諾塔的玩法。書上P54-58。解析:棧的遞迴呼叫其實是函式引數是以棧的形式push進棧來呼叫函式的,因此遞迴是用到棧的,只是沒有很形象而已。解決漢塔的思路是這樣的:設n為漢諾塔
歸併排序(非遞迴) ----- C語言
歸併排序(Merge sort,臺灣譯作:合併排序)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。 演算法步驟:
二叉樹的非遞迴遍歷(前序中序後序非遞迴C語言)
前兩天做資料結構實驗,要求用非遞迴演算法遍歷二叉樹。只知道用棧來儲存資料,具體演算法還不太清楚。經過兩天的搜尋,看到網上很多種解法,很多解法都是用C++來寫的演算法,一直找不到用C語言寫的演算法,所以就總結了一下,用C寫出了一個遍歷二叉樹的三種非遞迴演算法。 前
關於棧與遞迴求解迷宮與迷宮最短路徑問題
一、棧實現迷宮問題: 問題描述:用一個二維陣列模擬迷宮,其中1為牆,0為通路,用棧方法判斷迷宮是否有出口,下圖為簡單模擬的迷宮: 思想: 1.首先給出入口點,如上圖入口點座標為{2,0}; 2.從入口點出發,在其上下左右四個方向試探,若為通路(值為0)時,則向前走,並將每
hanoi塔問題的遞迴實現
一、背景故事法國數學家愛德華·盧卡斯曾編寫過一個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面
資料結構之棧(Stack)的關於C語言的實現
C語言實現棧共有兩種方法,一種是使用陣列的包含最大Size的棧,另外一種是運用連結串列的方法實現 關於陣列方法實現的程式碼如下: #include<stdio.h> /** * Your MinStack struct will be instantiate
C語言程式設計實現,浮點型與字元陣列相互轉化
歡迎轉載,請註明出處,本文地址:http://blog.csdn.net/jk050802/article/details/8628764 聯絡郵箱:[email protected] 簡介 從浮點型轉換為字元型:這裡比較簡單,只需要用
詳解!C語言程式設計實現小遊戲“三子棋”
今天我們來程式設計實現一個充滿童趣的小遊戲“三子棋” 先來說一下三子棋的規則: 三子棋又叫九宮棋、圈圈叉叉、一條龍等。 將正方形對角線連起來,或相對兩邊依次擺上三個雙方棋子, 總之只要將自己的三個棋子走成一條線, 對方就算輸了。 不用再過多解釋了,相信大家一定都玩過! 那麼,該
課上補做:用C語言程式設計實現ls命令
課上補做:用C語言程式設計實現ls命令 一、有關ls ls :用來列印當前目錄或者制定目錄的清單,顯示出檔案的一些資訊等。 ls -l:列出長資料串,包括檔案的屬性和許可權等資料 ls -R:連同子目錄一同顯示出來,也就所說該目錄下所有檔案都會顯示出來 ls -a:可以將目錄下的全部檔案
計算位數最高達300位的兩個非負整數的乘積,C語言程式設計實現
-------世界太蕪雜,我幫你整理---- -------C語言大數相乘運算---------- 今天我們要程式設計實現的是兩個超長整型資料進行相乘,並輸出結果 比如: 2134897427972647678 * 3497892374 我們先來看看執行效果
離散數學真值表(c語言程式設計實現)
程式碼如下: 廢話不多說: 主要利用二進位制的轉化實現 #include <iostream> #include <math.h> using namespace std; void shuru(char *p,int s); void shu