简单的顺序栈实现 不足之处请留言指出

本文介绍了一种基于C语言的顺序栈实现方法,包括初始化、压栈、出栈等功能,并通过具体示例展示了栈的基本操作流程。

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

以下是头文件:

#pragma once
#ifndef __LIST_H__
#define __LIST_H__

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory.h> 


#endif

以下是代码实现:

#include "list.h"

#define STACK_INIT_SIZE 10    //初始大小
#define STACK_ADD 5     //增量

enum position { ERROR, OK, OVERFLOW=-2};  //0 1 -2

typedef int SElemType;
typedef struct {
	SElemType *base;
	SElemType *top;
	int stack_size;    //已分配的存储空间
}SqStack, *pStack;

int SqStack_Init(SqStack* stack);    //创建
int SqStack_Clear(SqStack* stack);     //清空
int SqStack_Push(SqStack* stack, const SElemType item);	//压栈
SElemType SqStack_Pop(SqStack* stack);	    //出栈
SElemType SqStack_Top(const SqStack* stack);	//获取栈顶元素
int SqStack_Size(const SqStack* stack);    //当前大小
int SqStack_Capacity(const SqStack* stack);	//当前容量
void SqStack_Print(const SqStack* stack);	//打印出栈各个元素



//int main()
//{
//	printf("------------------顺序栈测试------------------\n");
//	test6();
//	//printf("\n%d\n", OVERFLOW);
//	system("pause");
//	return 0;
//}

void test6()
{
	SqStack p;
	pStack stack = &p;
	SqStack_Init(stack);
	SqStack_Push(stack, 1);  SqStack_Push(stack, 2);  SqStack_Push(stack, 3);
	SqStack_Print(stack);

	printf("SqStack_Top:%d\n", SqStack_Top(stack));

	printf("SqStack_Size:%d\n", SqStack_Size(stack));

	printf("SqStack_Capacity:%d\n", SqStack_Capacity(stack));

	SqStack_Pop(stack);
	printf("一次出栈操作后:\n");
	SqStack_Print(stack);

}

int SqStack_Init(SqStack* stack)
{

	assert(stack);
	stack->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (stack->base == NULL)
	{
		exit(EOVERFLOW);
	}
	stack->top = stack->base;
	stack->stack_size = STACK_INIT_SIZE;
	return OK;
}

int SqStack_Clear(SqStack* stack)
{
	assert(stack);
	stack->top = stack->base;
	return OK;

}

int SqStack_Push(SqStack* stack, const SElemType item)
{
	assert(stack);    //判断seql是否有效

	if (stack->top - stack->base >= stack->stack_size)
	{
		if (!(stack->base = (SElemType *)realloc(stack->base, (stack->stack_size + STACK_ADD) * sizeof(SqStack))))
		{
			exit(OVERFLOW);//分配失败
		}
		stack->top = stack->base + stack->stack_size;
		stack->stack_size = stack->stack_size + STACK_ADD;
	}
	*stack->top++ = item;
	return OK;
}

SElemType SqStack_Pop(SqStack* stack)
{
	assert(stack);
	if (stack->top == stack->base)
	{
		exit(OVERFLOW);
	}
	return *(--stack->top);
}

SElemType SqStack_Top(const SqStack* stack)
{
	assert(stack);
	SElemType *temp = stack->top;
	return *(--temp);
}

void SqStack_Print(const SqStack* stack)
{
	assert(stack);

	SElemType *temp = NULL;
	temp = stack->top;
	while (temp != stack->base)
	{
		printf("%d ", *(--temp));
	}
	printf("\n");
}

int SqStack_Size(const SqStack* stack)
{
	assert(stack);
	return stack->top - stack->base;
}

int SqStack_Capacity(const SqStack* stack)
{
	assert(stack);
	return stack->stack_size;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值