汉诺塔的非递归实现(使用c++堆栈stack实现)

本文详细介绍了汉诺塔问题的非递归解决方案,通过使用栈来实现移动过程。代码中展示了如何创建节点并进行操作,同时指出了在使用栈时需要注意的细节,如正确地push节点和输出格式。该方法避免了递归带来的额外开销,提高了程序效率。

汉诺塔的非递归实现

题目

在这里插入图片描述

答案

#include<stack>
#include<iostream>
using namespace std;
struct node{
   
   
	int n,a,b,c;
	node(int m,int x,int y,int z):n(m)
汉诺塔非递归实现可借助堆栈以循环方式求解,即将N个盘子从起始柱通过借助柱移动到目标柱,并保证每个移动符合汉诺塔问题的要求[^1]。 以下是两种不同语言实现代码: ### C++实现 ```cpp #include<iostream> #include<cstdio> #include<stack> using namespace std; struct note{ //note表示每一次任务的状态,s是起点,e是终点,n是物品数量 char s,e; int n; }; stack<note> st; // 建栈实现“递归” void insert(stack<note> &t,char s,char e,int n){ // 将状态(起点为s,终点为e,数量为n)入栈 note N; N.s=s,N.e=e,N.n=n; t.push(N); } void print(note n){ // 输出节点n printf("%c -> %c\n",n.s,n.e); } char f(note n){ // 找到中转地 int a[4]={0}; a[n.s-'a']++; a[n.e-'a']++; int i=0; for(;i<=2;i++){ if(!a[i])break; } return 'a'+i; } int main(){ int n ; scanf("%d",&n); note N; N.s='a',N.e='c',N.n=n; st.push(N); while(!st.empty()){ N=st.top(); st.pop(); if(N.n==1) print(N); else { char x=f(N); insert(st,x,N.e,N.n-1); insert(st,N.s,N.e,1); insert(st,N.s,x,N.n-1); } } } ``` ### C语言实现 ```c #include <stdio.h> typedef struct { int n; // 盘子数 char from; // 起始柱 char aux; // 辅助柱 char to; // 目标柱 } Hanoi; void hanoi(int N, char from, char aux, char to) { Hanoi stack[200]; int top = -1; stack[++top] = {N, from, aux, to}; // 存入初始值 while (top != -1) { // 栈不为空 Hanoi now = stack[top--]; // 取出栈顶元素 if (now.n == 1) { // 盘子数为1时 printf("%c -> %c\n", now.from, now.to); } else { // 先将n - 1个盘子从from挪到aux,再将from上的1个盘子挪到to上,最后把aux上的n - 1个盘子挪到to上 // 因为是堆栈,先进后出,因此需要倒着压进堆栈 stack[++top] = {now.n - 1, now.aux, now.from, now.to}; // 把aux上的n - 1个盘子挪到to上 stack[++top] = {1, now.from, now.aux, now.to}; // 将from上的1个盘子挪到to上 stack[++top] = {now.n - 1, now.from, now.to, now.aux}; // 将n - 1个盘子从from挪到aux } } } int main() { int N; scanf("%d", &N); char from = 'a'; char aux = 'b'; char to = 'c'; hanoi(N, from, aux, to); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值