顺序栈和链栈实现汉洛塔
顺序栈:
#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.思维导图: 2.顺序栈基本操作的实现: 1.定义栈: 2. 初始化栈:Ini ...
- 【Python数据结构系列】❤️《栈(顺序栈与链栈)》——❤️知识点讲解+代码实现
灵魂拷问:为什么要学数据结构? 数据结构,直白地理解,就是研究数据的存储方式.数据存储只有一个目的,即为了方便后期对数据的再利用.因此,数据在计算机存储空间的存放,决不是胡乱的,这就要求我们选择一种好 ...
- java栈实现--链栈
链栈 一.实现过程 1.提供栈接口:IStack 2.提供结点类:Node 3.提供链栈的实现类:LinkedStack 4.提供清空(clear).判空(isEmpty).栈深度(length)等方 ...
- 数据结构学习笔记——链式存储结构实现栈(链栈)
目录 一.链栈的定义 二.链栈的初始化 三.判断链栈是否为空栈 四.进栈(插入操作) 五.出栈(删除操作) 六.读取链栈的栈顶元素 七.链栈的建立 八.链栈的遍历输出 链式存储结构实现栈完整代码 一个 ...
- 数据结构遍历顺序栈_链栈的初始化与遍历
初始化 我们在定义完一个数据结构的结构体之后,需要初始化才能使用.比如顺序栈的初始化,也就是构造一个空栈就行了.那么链栈如何初始化呢? 链栈初始化的目标也是要构造一个空栈.根据结构体定义,空栈是什么一 ...
- 数据结构-顺序栈、链栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- Java实现栈(顺序栈,链栈)
顺序栈: package SeqStack;public class Stack {private int top;private int base[];private int stackSize;p ...
- java顺序栈和链栈_Java的顺序栈和链式栈
栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...
- (王道408考研数据结构)第三章栈和队列-第一节:栈基本概念、顺序栈和链栈基本操作
文章目录 一:栈基本概念 (1)栈的定义 (2)压栈和出栈 (3)进栈出栈变化形式 (4)栈的操作 二:栈的顺序存储结构及其操作实现 (1)顺序栈的定义 (2)进栈 (3)出栈 (4)读取栈顶元素 ( ...
- 栈详解(顺序栈和链栈)
栈 什么是栈? 顺序栈 链栈 什么是栈? 栈是一种基本数据结构,因其拥有后进先出的特点(Last in First out),也就是LIFO,栈的一种常见用途就是用来判断一串字符中的括号是否有效. 括 ...
最新文章
- R语言ggplot2可视化包抑制数据轴使用科学计数法实战
- 皮一皮:学霸和学渣的区别
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
- 神经网络与机器学习 笔记—支持向量机(SVM)(上)
- win10锁定计算机会断网吗,Win10专业版如何设置锁屏后不断网?超详细的图文教程...
- linux下软件的卸载,Linux下各种格式软件的安装及卸载方法
- 洛谷P2258 子矩阵——题解
- k3刷机 重置_K3 官改刷官改升级或降级两种方法
- 动态规划(dp)的总结
- 不是技术牛人,如何拿到国内IT巨头的Offer
- 利用网页内容监控来提升网站收录排名
- java excel 批注_Excel里“批注”的各项操作介绍
- 粗暴解决《python数据挖掘入门与实践》第五章PCA案例中pd.read_csv函数里converters无作为的方案
- 7.5 SNN《脉冲神经网络研究进展综述》笔记
- 手机免流量,还会是天方夜谭吗?
- 对面装修,办公室放置绿萝,袋装活性炭,空气净化器,有用吗?
- 无人机动力测试台:150kg级-Flight Stand 150
- 使用postcss报错
- 使用 Hugo 和阿里云ECS搭建个人站
- 组合数学在计算机中的应用,组合数学在计算机科学中的应用
热门文章
- python 面向对象编程;(搬家具)
- Docker在蚂蚁金融云平台中的探索与实践
- 高数_第3章重积分_三重积分的奇偶性
- JAVA——实现求s=a+aa+aaa+aaaa+aa...a的值
- [CoreBluetooth] API MISUSE: can only accept this command while in the powered on state(iOS蓝牙)
- 物理综合 | congestion 报告解读
- B站小甲鱼Python基础学习课堂笔记
- 【题解】LuoGu5423:[USACO19OPEN]Valleys P
- matlab normx-x0_【 MATLAB 】norm ( Vector and matrix norms )(向量范数以及矩阵范数)
- debian9.6安装virtualbox