栈的顺序存储实现
首先要认识到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文件结构和结果
文件结构为
运行完成的结果为