1. 程式人生 > >Hanoi塔問題 棧與遞迴C語言程式設計實現

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