栈的实现(基础)

头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;		// 栈顶
	int capacity;  // 容量 
}ST;
// 初始化栈 
void STInit(Stack* ps);
// 入栈 
void STPush(Stack* ps, STDataType data);
// 出栈 
void STPop(Stack* ps);
// 获取栈顶元素 
STDataType STTop(Stack* ps);
// 获取栈中有效元素个数 
int STSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
bool STEmpty(Stack* ps);
// 销毁栈 
void STDestroy(Stack* ps);

函数实现

#define _CRT_SECURE_NO_WARNINGS 1
#include "t.h"
// 初始化栈 
void STInit(Stack* ps) {
	assert(ps);
	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}
// 入栈 
void STPush(Stack* ps, STDataType data) {
	assert(ps);
	if (ps->top == ps->capacity) {
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL) {
			perror("realloc fail");
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = data;
	ps->top++;
}
// 出栈 
void STPop(Stack* ps) {
	assert(ps);
	assert(!STEmpty(ps));
	ps->top--;
}
// 获取栈顶元素 
STDataType STTop(Stack* ps) {
	assert(ps);
	assert(!STEmpty(ps));
	return ps->a[ps->top - 1];
}
// 获取栈中有效元素个数 
int STSize(Stack* ps) {
	assert(ps);
	return ps->top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
bool STEmpty(Stack* ps){
	assert(ps);
	return ps->top == 0;
}
// 销毁栈 
void STDestroy(Stack* ps) {
	assert(ps);
	free(ps->a);
	ps->capacity = ps->top = 0;
}

测试文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"t.h"

int main()
{
	Stack s;
	STInit(&s);
	STPush(&s, 1);
	STPush(&s, 2);
	STPush(&s, 3);

	int top = STTop(&s);
	printf("%d ", top);
	STPop(&s);

	STPush(&s, 4);
	STPush(&s, 5);

	while (!STEmpty(&s))
	{
		int top = STTop(&s);
		printf("%d ", top);
		STPop(&s);
	}

	STDestroy(&s);

	return 0;
}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值