顺序栈的表示和实现

// 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值