从零实现数据结构第四集:栈的实现

声明部分stack.h:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef int STDataType;
typedef struct STNode
{
	STDataType* a;
	int top;
	int capacity;
}node;


void StackInit(node* stack);
void StackDestroy(node* stack);
void StackPush(node* stack, STDataType x);
void StackPop(node* stack);
STDataType StackTop(node* stack);
int StackSize(node* stack);

函数实现部分stack.c:

初始化函数:

void StackInit(node* stack)
{
	assert(stack);
	stack->a = NULL;
	stack->top =  0;
	stack->capacity = 4;
	stack->a = (STDataType*)malloc(sizeof(STDataType) * stack->capacity);
	if (stack->a == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
}

销毁函数:

void StackDestroy(node* stack)
{
	assert(stack);
	free(stack->a);
	stack->a = NULL;
	stack->top = stack->capacity = 0;
}

入栈函数:

void StackPush(node* stack, STDataType x)
{
	assert(stack);
	//这里在入栈之前要先判断是否满,如果满了要先进行扩容
	if (stack->top == stack->capacity)
	{
		//这里扩容逻辑和顺序表一样,扩二倍容量
		STDataType* temp = (STDataType*)realloc(stack->a, sizeof(STDataType) * stack->capacity * 2);
		if (temp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		stack->a = temp;
		stack->capacity *= 2;
	}
	// 这里我定义的栈顶是指下一个元素
	stack->a[stack->top] = x;
	stack->top++;//  栈顶上移一格
}

出栈函数:

void StackPop(node* stack)
{
	assert(stack);
	//这里出栈前要先判断是否已经是空了
	assert(stack->top > 0);
	stack->top--;//这里只需要将栈顶向下移动一格就行,如果后面再有元素直接覆盖就行
}

获取栈顶元素:

STDataType StackTop(node* stack)
{
	assert(stack);
	assert(stack->top > 0);
	return stack->a[stack->top - 1];
}

获取栈大小函数:

STDataType StackTop(node* stack)
{
	assert(stack);
	assert(stack->top > 0);
	return stack->a[stack->top - 1];
}

测试部分test.c :

#define _CRT_SECURE_NO_WARNINGS
#include "stack.h"

int main()
{
    node stack;
    StackInit(&stack);  // 初始化栈

    StackPush(&stack, 1);
    StackPush(&stack, 2);
    StackPush(&stack, 3);
    StackPush(&stack, 4);

    // 打印栈顶元素并出栈
    while (StackSize(&stack) > 0)
    {
        printf("%d ", StackTop(&stack));
        StackPop(&stack);
    }
    printf("\n");

    StackDestroy(&stack);  // 销毁栈

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值