aboutsummaryrefslogtreecommitdiff
path: root/src/common/stack.c
blob: 269dbc4fa1cd3579641b484f0204289394bc4bb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "common.h"

t_stack *stack_new(int size)
{
	t_stack *stack;

	if ((stack = (t_stack*)malloc(sizeof(t_stack))) == NULL)
		return (NULL);
	if ((stack->elements = (int*)malloc(sizeof(int) * size)) == NULL)
	{
		free(stack);
		return (NULL);
	}
	stack->top = -1;
	return (stack);
}

void stack_destroy(t_stack *stack)
{
	if (stack == NULL)
		return ;
	free(stack->elements);
	free(stack);
}

void stack_push(t_stack *stack, int n)
{
	stack->top++;
	printf("%d\n", stack->top);
	stack->elements[stack->top] = n;
}

void stack_pop(t_stack *stack)
{
	if (stack_empty(stack))
		return ;
	stack->top--;
}

int  stack_peek(t_stack *stack)
{
	if (stack_empty(stack))
		return (0);
	return (stack->elements[stack->top]);
}

void stack_swap(t_stack *stack)
{
	int first;
	int second;

	if (stack_length(stack) < 2)
		return ;
	first = stack_peek(stack);
	stack_pop(stack);
	second = stack_peek(stack);
	stack_pop(stack);
	stack_push(stack, first);
	stack_push(stack, second);
}

void stack_push_to(t_stack *from, t_stack *to)
{
	int tmp;

	if (stack_empty(from))
		return ;
	tmp = stack_peek(from);
	stack_pop(from);
	stack_push(to, tmp);
}

void stack_rotate(t_stack *stack)
{
	int tmp;

	if (stack_length(stack) < 2)
		return ;
	tmp = stack_peek(stack);
	ft_memmove(&stack->elements[1], stack->elements, sizeof(int) * stack->top);
	stack->elements[0] = tmp;
}

void stack_reverse_rotate(t_stack *stack)
{
	int tmp;

	if (stack_length(stack) < 2)
		return ;
	tmp = stack->elements[0];
	ft_memmove(stack->elements, &stack->elements[1], sizeof(int) * stack->top);
	stack_push(stack, tmp);
}

t_bool	stack_empty(t_stack *stack)
{
	return (stack->top == -1);
}

int		stack_length(t_stack *stack)
{
	return (stack->top + 1);
}