- 浏览: 131030 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
fascism219:
哇!您这篇博客写的太好了,看了以后感觉很受用!我最近正在做CE ...
移植CESM1.2和运行CLM4.5问题汇总 -
deepfuture:
不错,用栈来实现递归,速度和效率较高,建议部分栈操作这块用内联 ...
数据结构:栈应用_求解汉诺塔(Hanoi)1
/************************************************************************/
/* 数据结构:栈应用:汉诺塔(Hanoi)问题 */
/* 挑灯看剑-shuchangs@126.com 2010-10 */
/* 云歌国际(Cloud Singers International) www.cocoral.com */
/************************************************************************/
#include <stdio.h>
#include <malloc.h>
#include "core.h"
/************************************************************************/
/* 以下是栈基本操作 */
/************************************************************************/
//结点数据结构
typedef struct NODE
{
int data;
struct NODE* next;
struct NODE* prior;
}Node, * NodePointer;
//栈元数据结构
typedef struct STACK
{
int len;
struct NODE* top;
struct NODE* base;
}Stack, * StackPointer;
void main_HANOI()
{
//*************函数原型******************
Status StackIn(StackPointer SP, int e);
void autoStack(StackPointer SP, int n);
void StackPrint(Stack S, char tag);
Status StackOut(StackPointer SP, NodePointer NP);
void Hanoi();
//*************函数原型******************
Stack S = { 0, NULL, NULL };
Node N = { 0, NULL, NULL};
int i = 0;
//autoStack(&S, 4);
//StackPrint(S, 't');
Hanoi();
}
//进栈操作,结点作为栈顶元素入栈
Status StackIn(StackPointer SP, int e)
{
static Status StackIsEmpty(Stack S);//函数原型
Status status = ERROR;
NodePointer p = NULL;//遍历指针,非游离指针
NodePointer NP = (NodePointer) malloc(sizeof(Node));
NP->data = e;
//进行预处理
if (!StackIsEmpty(*SP))
{
//将结点追加为栈顶元素
p = SP->top; //p指向栈顶
p->next = NP;
NP->prior = p;
NP->next = NULL;
SP->top = NP;
SP->len += 1; //长度加1
//puts("进栈成功!");
status = OK;
}
else
{
SP->base = SP->top = NP;
NP->next = NP->prior = NULL;
SP->len = 1; //长度为1
//puts("进栈成功!");
status = OK;
}
return status;
}
//自动化栈,初始化汉诺塔(Hanio)
void autoStack(StackPointer SP, int n)
{
COUNT i;
for (i = n; i >= 1; i--)
{
if (StackIn(SP, i))
{}
else
{
break;
}
}
}
static Status StackIsEmpty(Stack S)
{
if (S.len == 0 || S.base == NULL || S.top == NULL)
return TRUE;
else
return FALSE;
}
//出栈操作,并用结点返回该值
Status StackOut(StackPointer SP, NodePointer NP)
{
Status status = ERROR;
NodePointer p = SP->top; //p指向栈顶
if (!StackIsEmpty(*SP))
{
if (SP->len == 1)
{
SP->base = SP->top = NULL;
SP->len = 0; //长度为0
NP->data = p->data;
NP->next = p->next;
NP->prior = p->prior;
//puts("出栈成功!");
status = OK;
}
else
{
p->prior->next = NULL;
SP->top = p->prior;
SP->len -= 1; //长度减1
NP->data = p->data;
NP->next = p->next;
NP->prior = p->prior;
//puts("出栈成功!");
status = OK;
}
}
else
{
//puts("出栈失败!栈为空!");
status = ERROR;
}
free(p); //p为游离结点,最后释放p内存
return status;
}
//栈打印操作,tag参数IN SET{'B','T'}
void StackPrint(Stack S, char tag)
{
static Status StackIsEmpty(Stack S);//函数原型
NodePointer p = NULL;
COUNT i = 1;
COUNT n = S.len;
printf("栈长度:%d\n", n);
if (!StackIsEmpty(S)) //如果线性链表非空
{
switch (tag)
{
case 'B':
p = S.base;
puts("打印结点信息(栈底到栈顶):");
for (i = 1; i <= n; i++)
{
printf("Node[%d] = %d\n", i, p->data);
p = p->next;
}
break;
case 'b':
p = S.base;
puts("打印结点信息(栈底到栈顶):");
for (i = 1; i <= n; i++)
{
printf("Node[%d] = %d\n", i, p->data);
p = p->next;
}
break;
case 'T':
p = S.top;
puts("打印结点信息(栈顶到栈底):");
for (i = n; i >= 1; i--)
{
printf("Node[%d] = %d\n", i, p->data);
p = p->prior;
}
break;
case 't':
p = S.top;
puts("打印结点信息(栈顶到栈底):");
for (i = n; i >= 1; i--)
{
printf("Node[%d] = %d\n", i, p->data);
p = p->prior;
}
break;
default:
puts("打印失败!");
break;
}
}
else //如果栈为空
{
puts("打印失败!栈为空!");
}
free(p);//p为游离结点,最后释放p内存
}
/************************************************************************/
/* 以下为汉诺塔(Hanoi)求解 */
/************************************************************************/
void Hanoi()
{
void recursion(int n, StackPointer from, StackPointer tmp,
StackPointer to, int* stn);
Stack A = { 0, NULL, NULL }; //起始栈
Stack B = { 0, NULL, NULL }; //临时栈
Stack C = { 0, NULL, NULL }; //目的栈
int n = 4;
int cnt = 0; //统计搬运次数
//初始化A,生成4阶Hanoi
autoStack(&A, n);
puts("--------------------------------");
puts("汉诺塔:搬运前 A塔 盘子情况:");
StackPrint(A, 't');
puts("\nB塔 盘子情况:");
StackPrint(B, 't');
puts("\nC塔 盘子情况:");
StackPrint(C, 't');
puts("--------------------------------");
recursion(n, &A, &B, &C, &cnt); //递归调用
puts("--------------------------------");
puts("汉诺塔:搬运后 A塔 盘子情况:");
StackPrint(A, 't');
puts("\nB塔 盘子情况:");
StackPrint(B, 't');
puts("\nC塔 盘子情况:");
StackPrint(C, 't');
puts("--------------------------------");
printf("搬运次数合计:%d\n", cnt);
}
//参见版面《数据结构:栈应用_求解汉诺塔(Hanoi)2》
发表评论
-
数据结构:栈应用_求解汉诺塔(Hanoi)2
2010-10-15 16:05 1157/****************************** ... -
数据结构:栈应用_求解迷宫问题3
2010-10-11 20:31 1308/****************************** ... -
数据结构:栈应用_求解迷宫问题2
2010-10-11 20:27 1194/**************************** ... -
数据结构:栈应用_求解迷宫问题1
2010-10-11 20:24 1404/****************************** ... -
数据结构:栈基本操作
2010-10-11 20:18 933/****************************** ... -
数据结构:双向链表2
2010-10-11 20:15 787/****************************** ... -
数据结构:双向链表1
2010-10-11 20:01 787/****************************** ... -
数据结构:线性链表
2010-10-11 19:30 1069/****************************** ... -
数据结构:CORE头文件
2010-10-11 17:26 933/****************************** ... -
数据结构:动态线性顺序表
2010-10-11 17:22 996/****************************** ...
相关推荐
汉诺塔 可以实现汉诺塔的解决 步骤的计算
用Csharp写的一个汉诺塔程序源代码,相信对初学者很有帮助
利用栈求解汉诺塔问题 问题描述 汉诺塔问题: 现有三个塔座,在塔1上叠有64个碟子,所有碟子按从大到小的次序从塔底堆放至塔顶。在塔1旁边还有另外两个塔座(塔2和塔3)。 要求每次移动一个碟子,将塔1上的64个...
这是图形界面的汉诺塔程序,是在VC6的MFC开发环境中编写的
用C++实现汉诺塔的递归算法,定义了类和方法。
实验报告书 课程名: 数据结构 题 目: 汉诺塔 班 级: 学 号: 姓 名: 一、目的与要求 1)掌握栈与队列的数据类型描述及特点; 2)熟练掌握栈的顺序和链式存储存表示与基本算法的实现; 3)掌握队列的链式存储表示...
任意输入N个盘,在三个柱子上实现汉诺塔问题的非递归求解,用栈进行
用递归的方法解决汉诺塔问题的思想。
数据结构用栈实现汉诺塔,用递归给你讲吧,先想这个棵树Tn,先把最下面的n要搬走,就得把上面的n-1个先搬走,这个n-1个也形成一个树T(n-1),然后又把这n-1个搬到n上面又形成一个T(n-1)的树,这个你就可以画出来...
用汇编解决汉诺塔问题,可以求15块板以下的方案。
汉诺塔代码A*算法,根据人工智能提供的算法思路,编写的程序
汉诺塔的非递归实现,希望可以帮助大家学习一下哦
C#图形界面汉诺塔Hanoi
一个简单的汉诺塔游戏,利用java程序实现的
汉诺塔 首先实现柱子柱子间的的移动 然后实现汉诺塔
1:学习栈的原理; 2:熟悉链表的构建与使用,利用链表实现栈; 3:利用栈求解汉诺塔问题; (里面都有文档的详细讲解)
汉诺塔的VC++源码,喜欢的下载吧,这个问题还真是麻烦~~~~~这个网页太不好用
汉诺塔非递归程序,包含详细的解析、代码、结果及心得
汉诺(Hanoi)塔问题
这是使用python语言编程的小游戏,汉诺塔hanoi,欢迎大家下载