找了很多栈的文章,都是用的数组作为栈结构,这样就会有大小限制,并且在使用的时候还得设置一下大小,并不能上手就直接使用,这样一点都不帅。所以我决定自己写一个,栈+模板+链表,这样什么东西都能装并且不需要设置大小。对了,你要是问我为什么不用stl的栈?自己写一个不帅吗?并且也不复杂,还锻炼了动手能力!好了不废话了,直接看代码吧。
template<class T>
struct Node
{
T *data;
Node<T> *next;
};
template <class T>
class Stack {
private:
Node<T> *top_m;
public:
void push(T const&t) // 入栈
{
Node<T> *temp=new Node<T>;//这一步是一定要有的,因为需要一个实体化(就是具有内存空间)的节点
temp->data=new T(t);
temp->next=top_m;
top_m=temp;
}
void pop()// 出栈
{
Node<T> *temp;
temp=top_m;
top_m=top_m->next;
delete temp;
}
T top() const //返回栈顶元素
{
return *top_m->data;
}
};
看看使用效果咋样:
int main()
{
Stack<int> stack_int;
stack_int.push(1);
stack_int.push(2);
printf("%d ",stack_int.top());
stack_int.push(3);
stack_int.push(4);
stack_int.pop();
printf("%d ",stack_int.top());
stack_int.pop();
stack_int.pop();
printf("%d \n",stack_int.top());
return 0;
}
输出:
2 3 1
使用模板:
//定义一个Student结构体
struct student
{
student(const char *name_m,int age_m)
{
strcpy(name,name_m);
age=age_m;
}
char name[10];
int age;
};
int main()
{
Stack<struct student> stack_s;
student s1={"sxc",18};
stack_s.push(s1);
stack_s.push(student("aabb",20));
printf("name:%s,age:%d\n",stack_s.top().name,stack_s.top().age);
stack_s.pop();
printf("name:%s,age:%d\n",stack_s.top().name,stack_s.top().age);
return 0;
}
输出:
name:aabb,age:20
name:sxc,age:18
我自己也就测试了这两个例子,不保证其他类型不出问题,有问题直接私信就行。