栈的实现(顺序空间)

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
在这里插入图片描述
我们可以使用一个数组来当作栈的容器,然后每次增加和删除某位的元素即可,为了让这个数据结构具有更好的通用性。我们使用void*(万能指针)来作为数据的参数进行储存。使用一个size的字段作为一个容器的大小的记录单位。

#include<iostream>
#pragma warning (disable:4996)
#define SEQSTACK_TRUE 1
#define SEQSTACK_FALSE 0

using namespace std;
//用数组去模拟栈的顺序储存
#define MAX_SIZE 1024

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 FreeSeqStack(Seqstack* stack);
//清空
void Clear_SeqStack(Seqstack* stack);

//初始化栈
Seqstack* Init_Seqstack()
{
	Seqstack* stack = new Seqstack;
	stack->data[MAX_SIZE] = { NULL };
	stack->size = 0;
	return stack;
}
//入栈操作
void Push_Seqstack(Seqstack* stack, void* data)
{
	if (stack->size == MAX_SIZE || stack == NULL || data == NULL)
		return;
	stack->data[stack->size] = data;
	stack->size++;
}
//返回栈顶元素
void* Top_Seqstack(Seqstack* stack)
{
	if (stack == NULL||stack->size==0)
		return NULL;
	return stack->data[stack->size-1];
}
//出栈
void Pop_Seqstack(Seqstack* stack)
{
	if (stack->size == 0 || stack == NULL )
		return;
	 stack->size-- ;
}
//判断是否为空
int IsEmpty(Seqstack* stack)
{
	if (stack->size == 0)
		return SEQSTACK_TRUE;
	return SEQSTACK_FALSE;
}
//返回栈中元素的个数
int Size_SeqStack(Seqstack* stack)
{
	return stack->size;
}
//销毁
void FreeSeqStack(Seqstack* stack)
{
	delete stack;
}
//清空
void Clear_SeqStack(Seqstack* stack)
{
	if (stack == NULL)
		return;
	stack->size = 0;
}
typedef struct Person
{
	char name[64];
};
int main(void)
{
	//创建栈 
	Seqstack* stack = Init_Seqstack();
	//数据入栈
	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");
	Push_Seqstack(stack, &p1);
	Push_Seqstack(stack, &p2);
	Push_Seqstack(stack, &p3);
	Push_Seqstack(stack, &p4);
	Push_Seqstack(stack, &p5);

	//输出
	while (stack->size > 0)
	{
		//访问栈顶元素
		Person * per =(Person*)Top_Seqstack(stack);
		cout << per->name << endl;
		//弹出元素
		Pop_Seqstack(stack);

	}
	//释放内存
	FreeSeqStack(stack);

	return 0;
}

我们可以看到入栈的顺序是从a到e而弹出的时候就变成了从e到a。显而易见,栈的规则是先进后出原则。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值