示例#1
0
void
stacked_queue_destroy(s_stacked_queue_t **queue)
{
    if (!NULL_PTR_P(queue) && stacked_queue_structure_legal_p(*queue)) {
        array_stack_destroy(&(*queue)->enter);
        array_stack_destroy(&(*queue)->leave);
        memory_cache_free(*queue);

        *queue = NULL;
    }
}
示例#2
0
static inline s_splay_tree_t *
splay_tree_find_max_i(s_splay_tree_t **tree)
{
    s_splay_tree_t *max_node;
    s_splay_tree_t **iterator;
    s_array_stack_t *path_stack;

    assert_exit(NON_NULL_PTR_P(tree));
    assert_exit(splay_tree_structure_legal_ip(*tree));

    iterator = tree;
    max_node = *tree;
    path_stack = array_stack_create();

    while (max_node->right) {
        array_stack_push(path_stack, TREE_PATH_R_ENCODE(iterator));
        iterator = &max_node->right;
        max_node = *iterator;
    }

    splay_tree_splaying(path_stack);
    array_stack_destroy(&path_stack);

    assert_exit(*tree == max_node);
    return max_node;
}
示例#3
0
static inline s_splay_tree_t *
splay_tree_find_i(s_splay_tree_t **tree, sint64 nice)
{
    s_splay_tree_t **iterator;
    s_splay_tree_t *splay_node;
    s_array_stack_t *path_stack;

    assert_exit(NON_NULL_PTR_P(tree));
    assert_exit(splay_tree_structure_legal_ip(*tree));

    iterator = tree;
    splay_node = *tree;
    path_stack = array_stack_create();

    while (splay_node) {
        if (nice < splay_node->nice) {
            array_stack_push(path_stack, TREE_PATH_L_ENCODE(iterator));
            iterator = &splay_node->left;
        } else if (nice > splay_node->nice) {
            array_stack_push(path_stack, TREE_PATH_R_ENCODE(iterator));
            iterator = &splay_node->right;
        } else {
            splay_tree_splaying(path_stack);
            assert_exit(*tree = splay_node);
            break;

        }
        splay_node = *iterator;
    }

    array_stack_destroy(&path_stack);
    return splay_node;
}
boolean
check_parantheses_match(const char *expr)
{
	int i = 0;
	array_stack_t pstack;
	boolean valid = TRUE;

	array_stack_init(&pstack, MAX_EXPR_SIZE);

	for (i=0; expr[i]; i++) {
		if (is_opening_parantheses(expr[i])) {
			array_stack_push(&pstack, expr[i]);
		} else if (is_closing_parantheses(expr[i])) {
			if (array_stack_isEmpty(&pstack)) {
				valid = FALSE;
				break;
			}
			int symb = array_stack_pop(&pstack);

			/** 'symb' must be matching opener for expr[i] */
			if (! is_matching_parantheses(symb, expr[i]) ) {
				valid = FALSE;
				break;
			}
		}
	}

	if (!array_stack_isEmpty(&pstack)) {
		valid = FALSE;
	}

	array_stack_destroy(&pstack);

	return valid;
}
示例#5
0
static inline s_splay_tree_t *
splay_tree_insert_i(s_splay_tree_t **tree, s_splay_tree_t *node)
{
    s_array_stack_t *path_stack;
    s_splay_tree_t *splay_node, **iterator;

    assert_exit(NON_NULL_PTR_P(tree));
    assert_exit(splay_tree_structure_legal_ip(node));
    assert_exit(splay_tree_structure_legal_ip(*tree));
    assert_exit(splay_tree_ordered_p(*tree));

    iterator = tree;
    splay_node = *iterator;
    path_stack = array_stack_create();

    while (splay_node) {
        if (node == splay_node) {
            pr_log_warn("Insert node exist, nothing will be done.\n");
            array_stack_destroy(&path_stack);
            return splay_node;
        } else if (node->nice < splay_node->nice) {
            array_stack_push(path_stack, TREE_PATH_L_ENCODE(iterator));
            iterator = &splay_node->left;
        } else if (node->nice > splay_node->nice) {
            array_stack_push(path_stack, TREE_PATH_R_ENCODE(iterator));
            iterator = &splay_node->right;
        } else {
            splay_tree_node_merge(splay_node, node);
            splay_tree_splaying(path_stack);
            array_stack_destroy(&path_stack);
            return splay_node;
        }

        splay_node = *iterator;
    }

    *iterator = node;
    splay_tree_splaying(path_stack);
    array_stack_destroy(&path_stack);

    assert_exit(*tree == node);
    assert_exit(splay_tree_ordered_p(*tree));

    return node;
}
示例#6
0
static inline void
trie_tree_sequence_remove_i(s_trie_tree_t *trie, uint32 *sequence, uint32 len)
{
    uint32 *seq;
    s_array_stack_t *stack;
    s_trie_tree_t *trie_node;

    assert_exit(!complain_zero_size_p(len));
    assert_exit(trie_tree_root_node_p(trie));
    assert_exit(trie_tree_structure_legal_p(trie));
    assert_exit(!NULL_PTR_P(sequence));

    seq = sequence;
    trie_node = trie;
    stack = array_stack_create();

    while (seq < sequence + len) {
        trie_node = trie_tree_sub_queue_find(trie_node, *seq);

        if (trie_node == NULL) {
            array_stack_destroy(&stack);
            return;
        } else {
            array_stack_push(stack, trie_node);
            seq++;
        }
    }

    while (!array_stack_empty_p(stack)) {
        trie_node = array_stack_pop(stack);

        if (trie_tree_sub_queue_empty_p(trie_node)) {
            trie_node->is_deleted = true;
        }
    }

    array_stack_destroy(&stack);
}
int main (void)
{
	array_stack_t mystack;
	int i;

	assert(array_stack_init(&mystack, MAX_STACK_SIZE) == 0);

	assert(array_stack_isEmpty(&mystack) == TRUE);

	array_stack_print(&mystack, printAsInt);
	for(i=0; i<MAX_STACK_SIZE; i++) {
		assert(array_stack_push(&mystack, (void *)(i+1)) == 0);
		array_stack_print(&mystack, printAsInt);

		assert((int)array_stack_peek(&mystack) == (i+1));
		assert(array_stack_len(&mystack) == (i+1));
	}

	assert(array_stack_isFull(&mystack) == TRUE);
	assert(array_stack_isEmpty(&mystack) == FALSE);
	assert(array_stack_push(&mystack, (void *)(11)) == -EINVAL);
	
	for(i=0; i<MAX_STACK_SIZE; i++) {
		assert((int)array_stack_peek(&mystack) == (MAX_STACK_SIZE-i));
		assert(array_stack_len(&mystack) == (MAX_STACK_SIZE-i));

		assert(array_stack_pop(&mystack) == (MAX_STACK_SIZE-i));
		array_stack_print(&mystack, printAsInt);
	}

	assert(array_stack_isFull(&mystack) == FALSE);
	assert(array_stack_isEmpty(&mystack) == TRUE);

	array_stack_destroy(&mystack);

	printf("All tests succeed!\n");

	return 0;
}