stack顺序存储的设计与实现

本文介绍了栈的基本概念及其顺序存储的实现方式,包括创建、销毁、清空栈等操作,并详细解释了每种操作的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、stack基本概念
    栈是一种特殊的线性表,栈仅能在线性表的一端进行操作,栈顶(top):允许操作的一端;栈底(bottom):不允许操作的一端。

二、stack的常用操作

    1. 创建栈
    2. 销毁栈

    3. 清空栈
    4. 进栈
    5. 出栈
    6. 获取栈顶元素

    7. 获取栈的大小


三、栈顺序存储的设计与实现

#ifndef _ZCH_SEQSTACK_H_
#define _ZCH_SEQSTACK_H_

typedef void SeqStack

SeqStack* Create(int capacity);

void Destroy(SeqStack* stack);

void Clear(SeqStack* stack);

int Push(SeqStack* stack, void* item);

void* Pop(SeqStack* stack);

void* Top(SeqStack* stack);

int Size(SeqStack* stack);

int Capacity(SeqStack* stack);

#endif

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

#include "zch_seqstack.h"

typedef struct _tag_SeqStack
{
    int capacity;
    int length;
    unsigned int *node;
}TSeqStack;

SeqStack* Create(int capacity)
{
    TSeqStack* ret = NULL;
    if(capacity < 0)
    {
        return NULL;
    }

    ret = (TSeqStack*)malloc(sizeof(TSeqStack) + sizeof(unsigned int) * capacity);

    if(NULL == ret)
    {
        return NULL;
    }

    memset(ret, 0, sizeof(TSeqStack) + sizeof(unsigned int) * capacity);

    ret->node = (unsigned int *)(ret + 1);
    ret->capacity = capacity;
    ret->length = 0;
    return ret;
}

void Destroy(SeqStack* stack)
{
    if(stack == NULL)
    {
    return;
    }
    free(stack);
    return;
}

void Clear(SeqStack* stack)
{
    TSeqStack* tStack = (TSeqStack*)stack;
    if(NULL == tStack)
    {
        return;
    }
    tStack->length = 0;
    return;
}

int Push(SeqStack* stack, void* item)
{
    TSeqStack* tStack = (TSeqStack*)stack;
    if(NULL == tStack || NULL == item)
    {
        return -1;
    }

    if(tStack->length >= tStack->capacity)
    {
        return -1;
    }

    tStack->node[tStack->length] = (unsigned int)item;

    tStack->length++;

    return 0;
}

void* Pop(SeqStack* stack)
{
    TSeqStack* tStack = (TSeqStack*)stack;
    if(NULL == tStack)
    {
        return NULL;
    }
    tStack->length--;
    return tStack->node[tStack->length];
}

void* Top(SeqStack* stack)
{
    TSeqStack* tStack = (TSeqStack*)stack;
    if(NULL == tStack)
    {
        return NULL;
    }
    return tStack->node[tStack->length - 1];
}

int Size(SeqStack* stack)
{
    TSeqStack* tStack = (TSeqStack*)stack;
    if(NULL == tStack)
    {
        return -1;
    }
    return tStack->length;
}

int Capacity(SeqStack* stack)
{
    TSeqStack* tStack = (TSeqStack*)stack;
    if(NULL == tStack)
    {
        return -1;
    }
    return tStack->capacity;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值