栈原理及C语言实现

一、栈的概念

栈在生活中的应用同样随处可见,比如装东西的箱子、袋子等,这些都是一个栈。

 

二、栈的特征

同样的,我们可以从这些日常物品中找到栈的特征。

想象一个装书本的箱子,你正在往里面放书(那么书本就对应于栈的成员),那么你就得按照以下规则存放:

1、新增成员都存在放当前栈的栈顶。(对应箱子来说,新存放的书每次都在顶部)

2、每次删除操作只能删除当前栈顶成员。(对应箱子来说,从箱子中取书,只能取最上面的一本)

 

三、栈支持的操作

1、创建一个栈

Stack* StackCreate() 
 
2、栈是否为空栈
bool IsStackEmpty()
 
3、往栈中添加一个成员
void StackPush() 
 
4、获取栈顶成员
TYPE GetStackTop()   // TYPE为栈成员类型
 
5、从栈中取出一个成员
void StackPop() 
 
四、栈的实现
具体代码如下:
 
const int StackSize = 15000; 
typedef struct {
    int *stackArray; // 实现栈的数组
    int size; // 栈的大小
    int used; // 栈中的元素数量
} Stack;

Stack* StackCreate() 
{
    Stack *mStack = malloc(sizeof(Stack));
    if(mStack == NULL)
    {
        return NULL;
    }
    mStack->stackArray = malloc(sizeof(int) * StackSize);
    if(mStack->stackArray == NULL)
    {
        return NULL;
    }
    mStack->size = StackSize;
    mStack->used = 0;
    return mStack;
}

bool IsStackFull(Stack *obj)
{
    return obj->used == obj->size;
}

bool IsStackEmpty(Stack *obj)
{
    return obj->used == 0;
}

void StackPush(Stack* obj, int val) 
{
    if(IsStackFull(obj))
    {
        return;
    }
    obj->stackArray[obj->used] = val; // 存当前入栈值
    obj->used++;
}

void StackPop(Stack* obj) 
{
    if(IsStackEmpty(obj))
    {
        return;
    }
    obj->used--;
}

int GetStackTop(Stack* obj) 
{
    return obj->stackArray[obj->used - 1];
}

void StackFree(Stack* obj) 
{
    free(obj->stackArray);
    free(obj);
}
posted @ 2022-04-11 16:27  守得云开月未明  阅读(94)  评论(0编辑  收藏  举报