aboutsummaryrefslogtreecommitdiff
path: root/src/common/stack.c
blob: cbd098657634b3cdd089ece25e824ffd185bfd72 (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
#include "stack.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 = 0;
	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->elements[stack->top] = n;
	stack->top++;
}

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

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

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

	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;

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

void stack_rotate(t_stack *stack)
{
	int tmp;

	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;

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