顺序栈:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define STACKSIZE 10

typedef struct stack
{
 int data[STACKSIZE];
 int top;
}stack;

bool isempty(stack *ps)
{
 return ps->top == -1;
}

void push(int num, stack *ps)
{
 (ps->top)++;
 (ps->data)[ps->top] = num;
}

int pop(stack *ps)
{
 if(!isempty(ps)){
  int ret = (ps->data)[ps->top];
  (ps->data)[ps->top] = 0;
  ps->top--;
  return ret;
 }
 else
  return 0;
}

void show(int hanois, stack *ps1, stack *ps2, stack *ps3)
{
 int i;
 for(i=0; i<hanois; i++){
  printf("%d/t%d/t%d/n", (ps1->data)[hanois-i-1],
   (ps2->data)[hanois-i-1], (ps3->data)[hanois-i-1]);
 }
 printf("-----------------/n");
}

void towers_of_hanoi(int hanois, stack *ps1, stack *ps2, stack *ps3)
{
 int tmp;
 if(hanois > 0){
  towers_of_hanoi(hanois-1, ps1, ps3, ps2);

tmp = pop(ps1);
  push(tmp, ps2);

towers_of_hanoi(hanois-1, ps3, ps2, ps1);
 }
}

void init(stack *ps, int hanois)
{
 int i;
 ps->top = -1;

for(i=0; i<hanois; i++){
  push(hanois-i, ps);
 }
}

int main(void)
{
 printf("how many hanois ? ");
 int hanois;
 scanf("%d", &hanois);

if(hanois > STACKSIZE){
  printf("too big/n");
  return 0;
 }

static stack s1, s2, s3;

init(&s1, hanois);
 init(&s2, 0);
 init(&s2, 0);

show(hanois, &s1, &s2, &s3);
 towers_of_hanoi(hanois, &s1, &s2, &s3);
 show(hanois, &s1, &s2, &s3);

return 0;
}

链栈实现:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

typedef struct stack
{
 int data;
 struct stack *next;
}stack;

void push(int num, stack **p2top)
{
 stack *new_node = (stack *)malloc(sizeof(stack));
 new_node -> data = num;
 new_node -> next = *p2top;
 *p2top = new_node;
}

int pop(stack **p2top)
{
 int ret;

if(*p2top != NULL){
  ret = (*p2top) -> data;
  *p2top = (*p2top) -> next;
 }
 else
  return 0;

return ret;
}

void show(int hanois, stack *top1, stack *top2, stack *top3)
{
 int i, tmp __attribute__((unused));
 for(i=0; i<hanois; i++){
  printf("%d/t%d/t%d/n", pop(&top1), pop(&top2), pop(&top3));
 }
 printf("-----------------/n");
}

void towers_of_hanoi(int hanois, stack **p2top1, stack **p2top2, stack **p2top3)
{
 int tmp;
 if(hanois > 0){
  towers_of_hanoi(hanois-1, p2top1, p2top3, p2top2);

tmp = pop(p2top1);
  push(tmp, p2top2);

towers_of_hanoi(hanois-1, p2top3, p2top2, p2top1);
 }
}

void init(stack **p2top, int hanois)
{
 int i;
 if(hanois > 0){
  for(i=0; i<hanois; i++){
   push(hanois-i, p2top);
  }
 }
 else
  return;
}

int main(void)
{
 printf("how many hanois ? ");
 int hanois;
 scanf("%d", &hanois);

stack *top1 = NULL, *top2 = NULL, *top3 = NULL;
 init(&top1, hanois);

show(hanois, top1, top2, top3);
 towers_of_hanoi(hanois, &top1, &top2, &top3);
 show(hanois, top1, top2, top3);

return 0;
}

顺序栈和链栈实现汉洛塔相关推荐

  1. 数据结构之 顺序栈、共享栈、链栈

    顺序栈.共享栈.链栈 一.思维导图: 二.栈的定义: 三.栈的特点: 四.栈的基本操作: 五.常考题型: 六.顺序栈: 1.思维导图: 2.顺序栈基本操作的实现: 1.定义栈: 2. 初始化栈:Ini ...

  2. 【Python数据结构系列】❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现

    灵魂拷问:为什么要学数据结构? 数据结构,直白地理解,就是研究数据的存储方式.数据存储只有一个目的,即为了方便后期对数据的再利用.因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好 ...

  3. java栈实现--链栈

    链栈 一.实现过程 1.提供栈接口:IStack 2.提供结点类:Node 3.提供链栈的实现类:LinkedStack 4.提供清空(clear).判空(isEmpty).栈深度(length)等方 ...

  4. 数据结构学习笔记——链式存储结构实现栈(链栈)

    目录 一.链栈的定义 二.链栈的初始化 三.判断链栈是否为空栈 四.进栈(插入操作) 五.出栈(删除操作) 六.读取链栈的栈顶元素 七.链栈的建立 八.链栈的遍历输出 链式存储结构实现栈完整代码 一个 ...

  5. 数据结构遍历顺序栈_链栈的初始化与遍历

    初始化 我们在定义完一个数据结构的结构体之后,需要初始化才能使用.比如顺序栈的初始化,也就是构造一个空栈就行了.那么链栈如何初始化呢? 链栈初始化的目标也是要构造一个空栈.根据结构体定义,空栈是什么一 ...

  6. 数据结构-顺序栈、链栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  7. Java实现栈(顺序栈,链栈)

    顺序栈: package SeqStack;public class Stack {private int top;private int base[];private int stackSize;p ...

  8. java顺序栈和链栈_Java的顺序栈和链式栈

    栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...

  9. (王道408考研数据结构)第三章栈和队列-第一节:栈基本概念、顺序栈和链栈基本操作

    文章目录 一:栈基本概念 (1)栈的定义 (2)压栈和出栈 (3)进栈出栈变化形式 (4)栈的操作 二:栈的顺序存储结构及其操作实现 (1)顺序栈的定义 (2)进栈 (3)出栈 (4)读取栈顶元素 ( ...

  10. 栈详解(顺序栈和链栈)

    栈 什么是栈? 顺序栈 链栈 什么是栈? 栈是一种基本数据结构,因其拥有后进先出的特点(Last in First out),也就是LIFO,栈的一种常见用途就是用来判断一串字符中的括号是否有效. 括 ...

最新文章

  1. R语言ggplot2可视化包抑制数据轴使用科学计数法实战
  2. 皮一皮:学霸和学渣的区别
  3. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
  4. 神经网络与机器学习 笔记—支持向量机(SVM)(上)
  5. win10锁定计算机会断网吗,Win10专业版如何设置锁屏后不断网?超详细的图文教程...
  6. linux下软件的卸载,Linux下各种格式软件的安装及卸载方法
  7. 洛谷P2258 子矩阵——题解
  8. k3刷机 重置_K3 官改刷官改升级或降级两种方法
  9. 动态规划(dp)的总结
  10. 不是技术牛人,如何拿到国内IT巨头的Offer
  11. 利用网页内容监控来提升网站收录排名
  12. java excel 批注_Excel里“批注”的各项操作介绍
  13. 粗暴解决《python数据挖掘入门与实践》第五章PCA案例中pd.read_csv函数里converters无作为的方案
  14. 7.5 SNN《脉冲神经网络研究进展综述》笔记
  15. 手机免流量,还会是天方夜谭吗?
  16. 对面装修,办公室放置绿萝,袋装活性炭,空气净化器,有用吗?
  17. 无人机动力测试台:150kg级-Flight Stand 150
  18. 使用postcss报错
  19. 使用 Hugo 和阿里云ECS搭建个人站
  20. 组合数学在计算机中的应用,组合数学在计算机科学中的应用

热门文章

  1. python 面向对象编程;(搬家具)
  2. Docker在蚂蚁金融云平台中的探索与实践
  3. 高数_第3章重积分_三重积分的奇偶性
  4. JAVA——实现求s=a+aa+aaa+aaaa+aa...a的值
  5. [CoreBluetooth] API MISUSE: can only accept this command while in the powered on state(iOS蓝牙)
  6. 物理综合 | congestion 报告解读
  7. B站小甲鱼Python基础学习课堂笔记
  8. 【题解】LuoGu5423:[USACO19OPEN]Valleys P
  9. matlab normx-x0_【 MATLAB 】norm ( Vector and matrix norms )(向量范数以及矩阵范数)
  10. debian9.6安装virtualbox