#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;
}