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

typedef int BOOL;
#define TRUE 1
#define FALSE 0

typedef struct node 
{
	int value;
	struct node *prev;
} Node;

typedef struct
{
	int value;
	BOOL flag;
} ListValue;

static Node* HEAD;
static Node* TAIL;

static int LENGTH = 0;

// O(1) operation, no growth by input
BOOL push(int value)
{
	Node* new_head = malloc(sizeof(Node));
	if (new_head == NULL)
		return FALSE;

	new_head->value = value;
	new_head->prev = HEAD;

	if (HEAD == NULL)
		TAIL = new_head;

	HEAD = new_head;
	++LENGTH;

	return TRUE;
}

// O(1) operation, no growth by input
ListValue pop()
{
	ListValue value = { 0, FALSE };
	Node* iterator = HEAD; 
	if (iterator == NULL)
		return value;

	if (HEAD != TAIL)
	{
		HEAD = iterator->prev;
	}
	else
	{
		HEAD = NULL;
		TAIL = NULL;
	}

	value.value = iterator->value;
	value.flag = TRUE;

	free(iterator);
	iterator = NULL;

	--LENGTH;
	return value;
}

// O(1) operation, no growth by input
ListValue peek()
{
	ListValue value = { 0, FALSE };
	Node* iterator = HEAD; 
	if (iterator == NULL)
		return value;

	value.value = iterator->value;
	value.flag = TRUE;

	return value;
}

int main()
{
	push(5);
	push(22);
	push(66);
	push(122);
	push(9);

	printf("peek: %d\n", peek().value);

	pop();

	printf("peek: %d\n", peek().value);

	pop();

	printf("peek: %d\n", peek().value);
}