尽管C++的STL库里面有Stack类,但是本着学习的目的,在参考他人成果的基础上,我决定自己实现一次。这个实现采用的是”链表+动态内存+模板”的方式实现。众所周知,栈是一种后进先出的数据结构,即先入栈的元素最后出栈,最后入栈的元素最先出栈。栈常常使用在计算机的变量存储中。
首先定义元素节点的数据结构:
template<typename T>
struct stackNode
{
T data;//存储的具体元素
stackNode* next;//指向下一个节点的指针
};
然后需要定义一个MyStack类:
template<typename T>
class MyStack
{
private:
unsigned int count;//计数目前stack中存储的元素个数
unsigned int maxSize;//stack中最大存储的元素个数
stackNode<T>* top;//stack头节点的指针
public:
MyStack();//默认构造函数,创建最多容纳10个元素的stack
MyStack(unsigned int ms);//自定义容纳个数
~MyStack();//析构函数
int push(T data);//压栈
int pop(void);//出栈
T getTop(void);//获取栈顶元素
bool isempty(void);//检查是否为空
bool isfull(void);//经检查是否已满
};
代码实现,注意:由于使用模板类,类中成员函数的实现需要在同一个.h文件连实现,不可以另外在同名的.cpp中实现;具体原因请见:https://blog.csdn.net/jinzeyu_cn/article/details/45795923,该博主研究比较深入。
template<typename T>
MyStack<T>::MyStack()
{
count = 0;
maxSize = 10;
top = NULL;
}
template<typename T>
MyStack<T>::MyStack(unsigned int ms)
{
count = 0;
maxSize = ms;
top = NULL;
}
template<typename T>
MyStack<T>::~MyStack()
{
stackNode<T>* p = new stackNode<T>;
for (unsigned int i = count; i >0; i--)
{
p = top;
top = p->next;
delete p;
}
}
template<typename T>
int MyStack<T>::push(T data)
{
count++;
if (isfull())
{
cout << "Error: This Stack is full" << endl;
cout << "File Path =" << __FILE__ << endl;
cout << "Function Name =" << __FUNCTION__ << endl;
cout << "Line =" << __LINE__ << endl;
return 1;
}
stackNode<T>* node = new stackNode<T>;
node->data = data;
node->next = top;
top = node;
return 0;
}
template<typename T>
int MyStack<T>::pop(void)
{
if (isempty())
{
cout << "Error: Stack is empty" << endl;
cout << "File Path =" << __FILE__ << endl;
cout << "Function Name =" << __FUNCTION__ << endl;
cout << "Line =" << __LINE__ << endl;
return 1;
}
stackNode<T>* p = top;
top = top->next;
delete p;
count--;
return 0;
}
template<typename T>
T MyStack<T>::getTop(void)
{
return top->data;
}
template<typename T>
bool MyStack<T>::isempty(void)
{
return count == 0 ? true : false;
}
template<typename T>
bool MyStack<T>::isfull(void)
{
return count > maxSize ? true : false;
}
代码不多,测试一下吧
#include<iostream>
#include"myStack.h"
using namespace std;
struct customer
{
char fullname[40];
double payment;
};
int main()
{
MyStack<customer> cus;
customer c[] = { { "Tom", 1000 }, { "Jane", 200.9 }, { "John", 399.22 }, {"Mark",88.99} };
customer temp;
for (int i = 0; i < 4; i++)
{
cus.push(c[i]);
}
double total_payment=0;
for (int i = 0; i < 4; i++)
{
temp = cus.getTop();
cout << "Name" << temp.fullname << endl;
cout << "payment=" << temp.payment << endl;
total_payment += temp.payment;
cout << "total payment=" << total_payment << endl;
cus.pop();
cout << endl;
}
system("pause");
return 0;
}
运行良好。。。。