栈的顺序存储实现

本文介绍了如何使用C语言实现顺序存储的栈,包括SeqStack.h头文件的定义,SeqStack.c中函数的具体实现,以及在main.c中的测试过程。通过顺序存储结构,实现了栈的基本操作,并展示了程序的文件结构和运行结果。
摘要由CSDN通过智能技术生成

栈的顺序存储实现

首先要认识到viod* p[2];表示的是两个创建一个包含两个元素的数组,每个元素是void* 类型。即

void * p[2];
//和这种写法相同
void *p0;
void *p1;

采用份文件的形式使用VS2013 C语言 编写


1 栈的顺序存储头文件SeqStack.h


#ifndef SEQSTACK_H
#define SEQSTACK_H


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


//先定义栈的最大存储元素个数
#define MAX_SIZE 1024
//宏定义 真1 假0
#define SEQSTACK_TURE 1
#define SEQSTACK_FALSE 0


//用数组来模拟顺序存储
typedef struct SEQSTACK
{
	void* data[MAX_SIZE];// 定义一个元素个数为MAX_SIZE的数组,每个元素时void* 类型
	int size;      //用于记录栈中目前以存储的元素个数
}SeqStack;

//初始化
SeqStack * InIt_SeqStack();
//入栈
void Push_SeqStack(SeqStack * stack, void * data);
//返回栈顶元素
void * Top_SeqStack(SeqStack * stack);
//出栈
void Pop_SeqStack(SeqStack * stack);
//判断是否为空
int IsEmpty(SeqStack *stack);
//返回栈中当前元素个数
int Size_SeqStack(SeqStack * stack);
//清空栈
void Clear_SeqStack(SeqStack * stack);
//销毁
void Free_SeqStack(SeqStack * stack);


#endif

2 实现这些函数功能SeqStack.c

#include "SeqStack.h"


//初始化
SeqStack * InIt_SeqStack()
{
	//申请空间
	SeqStack * stack = (SeqStack*)malloc(sizeof(SeqStack));
	if (stack == NULL)
	{
		printf("InIt_SeqStack err: -1\n");
		return NULL;
	}
	//初始化
	for (int i = 0; i < MAX_SIZE; i++)
	{
		stack->data[i] = NULL;
	}
	stack->size = 0;

	return stack;
}

//入栈
void Push_SeqStack(SeqStack * stack, void * data)
{
	if (stack == NULL)
	{
		printf("Push_SeqStack err: -1\n");
		return;
	}
	if (data == NULL)
	{
		printf("Push_SeqStack err: -2\n");
		return;
	}
	if (stack->size == MAX_SIZE)
	{
		printf("Push_SeqStack err: -3\n");
		return;
	}
	stack->data[stack->size] = data;
	stack->size++;
}

//返回栈顶元素
void * Top_SeqStack(SeqStack * stack)
{
	if (stack == NULL)
	{
		printf("Top_SeqStack err: -1\n");
		return NULL;
	}
	return stack->data[stack->size-1];
}

//出栈
void Pop_SeqStack(SeqStack * stack)
{
	if (stack == NULL)
	{
		printf("Pop_SeqStack err: -1\n");
		return ;
	}

	stack->data[stack->size - 1] = NULL;
	stack->size--;

}

//判断是否为空
int IsEmpty(SeqStack *stack)
{
	if (stack == NULL)
	{
		printf("IsEmpty err: -1\n");
		return -1;
	}
	if (stack->size == 0)
	{
		return SEQSTACK_TURE;
	}
	else
	{
		return SEQSTACK_FALSE;
	}
	
}

//返回栈中当前元素个数
int Size_SeqStack(SeqStack * stack)
{
	if (stack == NULL)
	{
		printf("Size_SeqStack err: -1\n");
		return -1;
	}
	return stack->size;
}

//清空栈
void Clear_SeqStack(SeqStack * stack)
{
	if (stack == NULL)
	{
		printf("Clear_SeqStack err: -1\n");
		return;
	}

	for (int i = 0; i < MAX_SIZE;i++)
	{
		stack->data[i] = NULL;
	}
	stack->size = 0;
}

//销毁
void Free_SeqStack(SeqStack * stack)
{
	if (stack == NULL)
	{
		printf("Free_SeqStack err: -1\n");
		return;
	}
	free(stack);
}



3 在main.c中测试

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SeqStack.h"

typedef struct PERSON
{
	char name[64];
	int age;
	 
}Person;

int main(void)
{
	//创建栈
	SeqStack * stack = InIt_SeqStack();
	//创建成员
	Person p1 = { "aaa", 10 };
	Person p2 = { "bbb", 10 };
	Person p3 = { "ccc", 10 };
	Person p4 = { "ddd", 10 };
	//元素入栈

	Push_SeqStack(stack, &p1);
	Push_SeqStack(stack, &p2);
	Push_SeqStack(stack, &p3);
	Push_SeqStack(stack, &p4);
	int size1 = Size_SeqStack(stack);
	printf("size = %d\n", size1);

	/*/
	Clear_SeqStack(stack);
	size1 = Size_SeqStack(stack);
	printf("size = %d\n", size1);
	*/

	//实现打印
	while (IsEmpty(stack) == SEQSTACK_FALSE)//当不为空时执行循环体
	{
		//获取栈顶元素,强制转型为用户输入类型(Person*)
		Person *pTop = (Person*) Top_SeqStack(stack);
		//打印
		printf("name = %s, age = %d\n", pTop->name, pTop->age);
		//栈顶元素出栈
		Pop_SeqStack(stack);
	}

	//销毁
	Free_SeqStack(stack);

	printf("\n");
	system("pause");
	return 0;
}

4文件结构和结果

文件结构为
在这里插入图片描述
运行完成的结果为
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜皮233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值