Restructured the example folder and added new examples

This commit is contained in:
Leonardo committed 2019-04-03 02:32:38 -03:00
1 parent eb16205224
commit 52e105995a
29 files changed
+442 -18

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
# Stack examples
* hanoi.c - Animated example of solving the hanoi tower.
+110
View File
@@ -0,0 +1,110 @@
/**
* hanoi.c
*
* Creation Date: 03/04/2019
*
* Authors:
* Leonardo Vencovsky (https://github.com/LeoVen)
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
STACK_GENERATE(s, stack, /* static */, int)
#define MAX(a, b) a > b ? a : b
void print_hanoi(stack *t1, stack *t2, stack *t3);
const char *draw(int value);
void move_disc(stack *from, stack *to);
void move_stack(stack *t1, stack *t2, stack *t3, size_t size);
int main(int argc, char const *argv[])
{
// 1- Hanoi towers showcase
stack *tower1 = s_new(10);
stack *tower2 = s_new(10);
stack *tower3 = s_new(10);
for (int i = 10; i > 0; i--)
s_push(tower1, i);
move_stack(tower1, tower3, tower2, s_count(tower1));
s_free(tower1);
s_free(tower2);
s_free(tower3);
return 0;
}
void print_hanoi(stack *t1, stack *t2, stack *t3)
{
const int max = 10;
static int step = 0;
printf("Step %d\n", ++step);
for (int i = max - 1; i >= 0; i--)
{
printf(" %10s|%-10s %10s|%-10s %10s|%-10s\n",
draw(t1->buffer[i]), draw(t1->buffer[i]),
draw(t2->buffer[i]), draw(t2->buffer[i]),
draw(t3->buffer[i]), draw(t3->buffer[i]));
}
printf(" ----------------------- ----------------------- -----------------------\n\n");
}
const char *draw(int value)
{
switch (value)
{
case 0:
return "";
case 1:
return "#";
case 2:
return "##";
case 3:
return "###";
case 4:
return "####";
case 5:
return "#####";
case 6:
return "######";
case 7:
return "#######";
case 8:
return "########";
case 9:
return "#########";
case 10:
return "##########";
default:
return "?";
}
}
void move_disc(stack *from, stack *to)
{
s_push(to, s_top(from));
s_pop(from);
}
void move_stack(stack *t1, stack *t2, stack *t3, size_t size)
{
if (size == 0)
return;
move_stack(t1, t3, t2, size - 1);
move_disc(t1, t2);
print_hanoi(t1, t2, t3);
move_stack(t3, t2, t1, size - 1);
}