ywrby

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

受限线性表

规则:先进(压栈)后出(出栈) 不能遍历


头文件:SeqStack.h

#ifndef SEQSTACK_H
#define SEQSTACK_H
#define MAX_SIZE 1024
#define TRUE_SEQSTACK 1
#define FALSE_SEQSTACK 0
#include<stdlib.h>
#include<stdio.h>

//用数组模拟栈的顺序存储

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(SeqStack* stack);
//返回栈中元素个数
int Size_SeqStack(SeqStack* stack);
//清空栈中元素
void Clear_SeqStack(SeqStack* stack);
//销毁栈
void FreeSpace_SeqStack(SeqStack* stack);

#endif // !SEQSTACK_H

实现文件:SeqStack.c

#include"SeqStack.h"





//初始化栈
SeqStack* Init_SeqStack() {
	SeqStack* stack = (SeqStack*)malloc(sizeof(SeqStack));
	for (int i = 0; i < MAX_SIZE; i++) {
		stack->data[i] = NULL;  //初始化data内每个元素
	}
	stack->size = 0;
	return stack;
}
//入栈操作
void Push_SeqStack(SeqStack* stack, void*data) {
	//判断数据和栈是否正常可用
	if (stack->size == MAX_SIZE) {
		return;
	}
	if (stack == NULL) {
		return;
	}
	if (data == NULL) {
		return;
	}
	stack->data[stack->size] = data;
	stack->size++;

}
//返回栈顶元素
void* Top_SeqStack(SeqStack* stack) {
	if (stack == NULL) {
		return;
	}
	if (stack->size == 0) {
		return;
	}
	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(SeqStack* stack) {
	if (stack == NULL) {
		return -1;  //这是对stack不存在的返回操作,不是对空栈的操作
	}
	else if (stack->size == 0) {
		return TRUE_SEQSTACK;
	}
	return FALSE_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);
}


主文件:Main.c

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

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

int main() {
	//创建栈
	SeqStack* stack = Init_SeqStack();
	//创建数据
	Person p1 = { "Tom",26 };
	Person p2 = { "Bob",26 };
	Person p3 = { "Lala",26 };
	Person p4 = { "Leslie",26 };
	Person p5 = { "Hugo",26 };
	//入栈
	Push_SeqStack(stack, &p1);
	Push_SeqStack(stack, &p2);
	Push_SeqStack(stack, &p3);
	Push_SeqStack(stack, &p4);
	Push_SeqStack(stack, &p5);
	//输出
	while (Size_SeqStack(stack) > 0) {
		//访问栈顶元素
		Person* person=(Person*)Top_SeqStack(stack);
		//输出内容
		printf("Name:%-8s,Age:%-8d\n", person->name, person->age);
		//将元素从栈顶弹出
		Pop_SeqStack(stack);
	}

	//释放内存
	FreeSpace_SeqStack(stack);

	system("pause");
	return 0;
}

posted on 2020-03-04 08:09  ywrby  阅读(183)  评论(0)    收藏  举报