c++代码实现栈的顺序存储

本文详细介绍了如何使用C++实现一个顺序栈的数据结构,包括构造函数、入栈、出栈、获取栈顶元素、判断栈空和栈满等基本操作。并通过一个测试用例展示了如何将栈应用于存储和遍历person对象。代码清晰易懂,适合初学者学习。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
//定义栈的最大值常量
const int MAX = 1024;
//c++实现顺序栈
class stack 
{
private:
	//用一个void**的指针指向一个存放void*类型指针的数组
	void** data; //用来指向栈的数组
	int size; ///栈的大小
	int top; //栈顶:当前栈内元素个数
public:
	stack(); //无参构造
	stack(int size);//有参构造
	~stack();//析构函数
	void push(void* val);//入栈
	void pop();//出栈
	void* getTop();//获得栈顶元素
	bool isEmpty();//栈是否为空
	bool isFull();//栈是否已满
	void setNull();//设置栈为空
};
stack::stack()
{
	cout << "无参构造函数调用" << endl;
	size = MAX; //大小为最大
	top = -1;//栈初始化时没有元素
	//该数组里面存放的是void*指针
	data = new void*[MAX];//缺省构造函数分配最大内存空间
}
stack::stack(int size)
{
	cout << "有参构造函数调用" << endl;
	this->size = size;//用户指定大小
	top = -1;//初始化时没有元素
	//该数组里面存放的是void*指针
	data = new void*[size];//有参构造函数用户指定大小
}
stack::~stack()
{
	cout << "析构函数" << endl;;
	delete[] data; //内存回收
}
void stack::push(void* val)
{
	if (val == NULL)
		return;
	//入栈:尾插
    //每次入栈的时候先判断栈是否已满
	if (!isFull())
	{
		//更新top的位置,插入数据后top的值就是当前栈中元素的个数
		data[++top] = val;
	}
	//如果栈满了,可以用异常捕获的操作

}
void stack::pop()
{
	if (!isEmpty())
	{
		//先返回当前出栈的元素,再将top当前栈元素的数量减一
		--top;
	}

}
void* stack::getTop()
{
	if (!isEmpty())
	{
		return data[top];
	}
	return NULL;
}
bool stack::isFull()
{
	if (top+1==size)
		return true;
	return false;
}
bool stack::isEmpty()
{
	if (top == -1)
		return true;
	return false;
}
void stack::setNull()
{
	top = -1;
}
//测试代码--------------------------------
class person {
public:
	string name;
	int age;
};
void test()
{
	//测试
	person p[3] = { {"大忽悠",19},{"小朋友",19},{"大猪头",18} };
	//初始化栈
	stack s1(3);
	//入栈
	s1.push(&p[0]);
	s1.push(&p[1]);
	s1.push(&p[2]);
	//遍历输出
	while (!s1.isEmpty())
	{
		//返回栈顶元素进行输出
		person* p1 = (person*)s1.getTop();
		cout << "姓名: " << p1->name << "年龄:" << p1->age << endl;
		s1.pop();
	}
}
int main()
{
	test();
	system("pause");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值