顺序栈的表示和实现

来源:互联网 发布:乔纳森西蒙斯魔术数据 编辑:程序博客网 时间:2024/05/07 19:17
// 2014年4月16日// 顺序栈的表示和实现// tag_stack_t 的数据格式//// size             栈的大小//         [data]// top  -> [data]   栈顶//         [data]   第一个节点//         [data]// base -> [data]   栈底#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <time.h>typedef int element_t;typedef struct tag_stack_t{    size_t    size;    element_t *top;    element_t *base;} *stack_t;// 初始化一个只有一个节点的栈// 符合栈已满的判断条件,这是一个满了的栈void stack_init(stack_t& stack){    stack = (stack_t)malloc(sizeof(tag_stack_t));    stack->base = (element_t *)malloc(sizeof(element_t));    stack->top = stack->base;    stack->size = 1;}void stack_destroy(stack_t& stack){    free(stack->base);    free(stack);    stack = 0;}bool stack_is_empty(stack_t& stack){    return stack->top == stack->base;}bool stack_is_full(stack_t& stack){    return stack->top == stack->base + stack->size;}void stack_push(stack_t& stack, element_t e){    if (stack_is_full(stack))    {        // 栈已满,大小增长一倍        size_t size = stack->size << 1;        stack->base = (element_t *)realloc(stack->base,                                           size * sizeof(element_t));        stack->top = stack->base + stack->size;        stack->size = size;    }    // 栈顶指针指向的位置是空的,先放进去,再更新栈顶指针    *stack->top = e;    ++stack->top;}bool stack_pop(stack_t& stack, element_t& e){    if (stack_is_empty(stack))    {        return false;    }    // 栈顶指针指向的位置是空的,先更新栈顶指针,再取出数据    --stack->top;    e = *stack->top;    return true;}void print(stack_t& stack){    for (element_t *p = stack->top - 1; p >= stack->base; --p)    {        printf("%02d ", *p);    }    printf("\n");}int range(int a, int b){    return rand()%b + a;}int main(){    int n = 10;    int size = 20;    srand((unsigned)time(0));    while (n--)    {        stack_t stack;        stack_init(stack);        // 随机入栈        int a = range(1, size);        while (a--)        {            int i = range(1, 10);            stack_push(stack, i);            print(stack);        }        // 随机出栈        int b = range(1, size);        while (b--)        {            int i = range(1, 10);            if (!stack_pop(stack, i))            {                break;            }            print(stack);        }        stack_destroy(stack);    }    return 0;}

0 0
原创粉丝点击