C++实现栈的基本操作



#define _CRT_SECURE_NO_WARNINGS 1

#pragma once


#include<iostream>
#include<assert.h>
#include<stdlib.h>
#include<string>
using namespace std;


template<typename T>
class Stack
{
public:
Stack();//构造
~Stack();//析构
Stack(const Stack<T>&s);//拷贝构造
Stack<T>&operator=(const Stack<T>&s);//赋值运算符的重载
void Push(const T&d);//进栈
void Pop();//出栈
T &Top();//顶
bool IsEmpty();//判空
size_t Size();//栈的大小
protected:
void _checkcapacity();//检查栈是否满了
protected:
T*_a;
size_t _top;
size_t _capacity;
};


template <typename T>
void Stack<T>::_checkcapacity()
{
if (_a == NULL)
{
_capacity = 3;//初始值
_a = new T[_capacity];
return;
}
if (_top == _capacity)
{
_capacity += 3;//一次增加3
T*tmp = new T[_capacity];
for (size_t i = 0; i < _top; i++)
{
tmp[i] = _a[i];
}
delete[]_a;
_a = tmp;
}
}


template<class T>
Stack<T>::Stack()
:_a(0)
, _top(0)
, _capacity(0)
{}


template<class T>
Stack<T>::~Stack()
{
if (_a)
{
delete[] _a;
}
}


template<class T>
Stack<T>::Stack(const Stack<T>& s)
:_a(new T[s._top])
, _top(s._top)
, _capacity(s._capacity)
{
for (int i = 0; i < _top; ++i)
{
_a[i] = s._a[i];
}
}


//template<class T>  
//Stack<T>& Stack<T>::operator=(Stack<T> s)//现代写法  
//{  
//      swap(s._a,_a);  
//      _top = s._top;  
//      _capacity = s._capacity;      
//      return *this;  
//} 


template<class T>
Stack<T>& Stack<T>::operator=(const Stack<T>& s)//传统写法  
{
if (this != &s)
{
T* tmp = new T[s._top];
for (size_t i = 0; i < s._top; i++)
{
tmp[i] = s._a[i];
}
delete[] _a;
_a = tmp;
_capacity = s._top;
_top = s._top;
}
return *this;
}


template<class T>
void Stack<T>::Push(const T&d)
{
_checkcapacity();
_a[_top++] = d;
}


template<class T>
void Stack<T>::Pop()
{
assert(_top > 0);
--_top;
}


template<class T>
T& Stack<T>::Top()
{
assert(_top > 0);
return _a[_top - 1];
}


template<class T>
bool Stack<T>::IsEmpty()
{
return _top == 0;
}


template<class T>
size_t Stack<T>::Size()
{
return _top;
}


void TestStack()
{
Stack<string> s;
s.Push("1111111");
s.Push("2222222");
s.Push("3333333");
s.Push("4444444");
s.Push("5555555");
Stack<string> s1(s);
Stack<string> s2;
s2 = s;
while (!s2.IsEmpty())
{
cout << s2.Top() << " ";
s2.Pop();
}
}
int main()
{
TestStack();
system("pause");
return 0;

}


代码运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值