
模拟入栈和出栈
#ifndef SEQSTACK_H #define SEQSTACK_H #include#include //数组去模拟栈的顺序存储 #define MAX_SIZE 1024 #define SEQSTACK_TRUE 1 #define SEQSTACK_FALSE 0 typedef struct SEQSTACK { void* data[MAX_SIZE]; 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 FreeSpace_SeqStack(SeqStack* stack); #endif
#include "SeqStack.h"
//初始化栈
SeqStack* Init_SeqStack()
{
SeqStack* stack = (SeqStack*)malloc(sizeof(SeqStack));
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)
{
return;
}
if (stack->size == MAX_SIZE)
{
return;
}
if (data == NULL)
{
return;
}
stack->data[stack->size] = data;
stack->size++;
}
//返回栈顶元素
void* Top_SeqStack(SeqStack* stack)
{
if (stack == NULL) {
return NULL;
}
if (stack->size == 0) {
return NULL;
}
return stack->data[stack->size-1];
}
//出栈
void Pop_SeqStack(SeqStack* stack)
{
if (stack == NULL) {
return;
}
if (stack->size == 0) {
return;
}
stack->data[stack->size - 1] = NULL;
stack->size--;
}
//判断是否为空
int IsEmpty(SeqStack* stack)
{
if (stack == NULL) {
return -1;
}
if (stack->size == 0) {
return SEQSTACK_TRUE;
}
return SEQSTACK_FALSE;
}
//返回栈中元素的个数
int Size_SeqStack(SeqStack* stack)
{
return stack->size;
}
//清空栈
void Clear_SeqStack(SeqStack* stack)
{
if (stack == NULL) {
return;
}
for (int i = 0; i < stack->size; i++) {
stack->data[i] = NULL;
}
stack->size = 0;
}
//销毁
void FreeSpace_SeqStack(SeqStack* stack)
{
if (stack == NULL) {
return;
}
free(stack);
}
//栈的顺序存储测试
typedef struct PERSON
{
char name[64];
int age;
}Person;
int main()
{
//创建栈
SeqStack* stack1 = Init_SeqStack();
//创建数据
Person p1 = { "aaa",10 };
Person p2 = { "bbb",20 };
Person p3 = { "ccc",30 };
Person p4 = { "ddd",40 };
//入栈
Push_SeqStack(stack1, &p1);
Push_SeqStack(stack1, &p2);
Push_SeqStack(stack1, &p3);
Push_SeqStack(stack1, &p4);
//输出,当栈中元素个数大于0时候输出
while (Size_SeqStack > 0)
{
//访问栈顶元素
Person* person = (Person*)Top_SeqStack(stack1);
printf("Name: %s Age: %dn", person->name, person->age);
//d出栈顶元素
Pop_SeqStack(stack1);
}
//释放内存
FreeSpace_SeqStack(stack1);
printf("n");
system("pause");
return 0;
}
栈的链式存储
这里的stack->head.next 等价于pNext
#ifndef linkSTACK_H #define linkSTACK_H #include#include //链式栈的结点 typedef struct linkNODE { struct linkNODE* next; }linkNode; //链式栈 typedef struct linkSTACK { linkNode head; int size; }linkStack; //初始化函数 linkStack* Init_linkStack(); //入栈 void Push_linkStack(linkStack* stack, linkNode* data); //出栈 void Pop_linkStack(linkStack* stack); //返回栈顶元素 linkNode* Top_linkStack(linkStack* stack); //返回栈元素的个数 int Size_linkStack(linkStack* stack); //清空栈 void Clear_linkStack(linkStack* stack); //销毁栈 void FreeSpace_linkStack(linkStack* stack); #endif
#include"linkStack.h"
//初始化函数
linkStack* Init_linkStack()
{
linkStack* stack = (linkStack*)malloc(sizeof(linkStack));
stack->head.next = NULL;
stack->size = 0;
return stack;
}
//入栈
void Push_linkStack(linkStack* stack, linkNode* data)
{
if (stack == NULL)
{
return;
}
if (data == NULL)
{
return;
}
data->next = stack->head.next;
stack->head.next = data;
stack->size++;
}
//出栈
void Pop_linkStack(linkStack* stack)
{
if (stack == NULL) {
return;
}
if (stack->size == 0) {
return;
}
//第一个有效结点
linkNode* pNext = stack->head.next;
stack->head.next = pNext->next;
stack->size--;
}
//返回栈顶元素
linkNode* Top_linkStack(linkStack* stack)
{
if (stack == NULL) {
return NULL;
}
if (stack->size == 0) {
return NULL;
}
return stack->head.next;
}
//返回栈元素的个数
int Size_linkStack(linkStack* stack)
{
if (stack == NULL) {
return -1;
}
return stack->size;
}
//清空栈
void Clear_linkStack(linkStack* stack)
{
if (stack == NULL) {
return;
}
stack->head.next = NULL;
stack->size = 0;
}
//销毁栈
void FreeSpace_linkStack(linkStack* stack)
{
if (stack == NULL) {
return;
}
free(stack);
}
//测试
typedef struct PERSON {
linkNode node;
char name[64];
int age;
}Person;
int main(void) {
//创建栈
linkStack* stack = Init_linkStack();
//创建数据
Person p1, p2, p3, p4, p5;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
strcpy(p4.name, "ddd");
strcpy(p5.name, "eee");
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50;
//入栈
Push_linkStack(stack, (linkNode*)&p1);
Push_linkStack(stack, (linkNode*)&p2);
Push_linkStack(stack, (linkNode*)&p3);
Push_linkStack(stack, (linkNode*)&p4);
Push_linkStack(stack, (linkNode*)&p5);
//输出
while (Size_linkStack(stack) > 0) {
//取出栈顶元素
Person* p = (Person*)Top_linkStack(stack);
printf("Name:%s Age:%dn", p->name, p->age);
//d出栈顶元素
Pop_linkStack(stack);
}
//销毁栈
FreeSpace_linkStack(stack);
system("pause");
return 0;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)