创建任意数据类型的栈
代码
#include <iostream>
#define MAX 5
using namespace std;
template<typename T>
class zhan
{
public:
zhan(T data); //有参构造
virtual ~zhan(); //析构函数
zhan(const zhan &other);//拷贝构造函数
bool empty(); //判空
bool full(); //判满
void init(); //入栈
void out(); //出栈
T get_h(); //获取栈顶元素
void dele(); //清空栈
long int big(); //栈的大小
private:
T *data;
int top;
};
int main()
{
zhan<int> s0(10);
zhan<char> s1('a');
s0.init();
s0.out();
cout << "当前栈顶元素:" << s0.get_h() << endl;
s0.dele();
s1.init();
s1.out();
cout << "当前栈顶元素:" << s1.get_h() << endl;
s1.dele();
return 0;
}
template<typename T> //有参构造
zhan<T>::zhan(T d):data(new T[MAX]),top(0){data[0] = d;}
template<typename T> //析构函数
zhan<T>::~zhan(){delete []data;}
template<typename T> //拷贝构造函数
zhan<T>::zhan(const zhan &other):data(new T[other.top+1]),top(other.top)
{
int i=0;
while(i <= other.top)
{
data[i] = other.data[i];
}
}
//入栈
template<typename T>
void zhan<T>::init()
{
char q;
if(zhan<T>::full())
{
cout << "栈已满!" << endl;
return;
}
else
{
while(top<MAX-1)
{
top++;
cout << "请输入数据:";
cin >> data[top];
while(getchar()!=10);
cout << "入栈成功!" << endl;
cout << "是否退出(q):" << endl;
cin >> q;
while(getchar()!=10);
if(q == 'q')
{
break;
}
}
}
}
//出栈
template<typename T>
void zhan<T>::out()
{
if(zhan<T>::empty())
{
cout << "栈为空!" << endl;
return;
}
else
{
cout << "当前栈顶元素:" << data[top] << endl;
cout << "出栈成功!" << endl;
top--;
}
}
//获取栈顶元素
template<typename T>
T zhan<T>::get_h()
{
return data[top];
}
//判空
template<typename T>
bool zhan<T>::empty()
{
if(top == -1)
{
return true;
}
else
{
return false;
}
}
//判满
template<typename T>
bool zhan<T>::full()
{
if(top == MAX-1)
{
return true;
}
else
{
return false;
}
}
//清空栈
template<typename T>
void zhan<T>::dele()
{
if(zhan<T>::empty())
{
cout << "栈为空!" << endl;
return;
}
else
{
top = -1;
cout << "栈清空成功!" << endl;
}
}
//栈的大小
template<typename T>
long int zhan<T>::big()
{
if(zhan<T>::empty())
{
cout << "栈为空!" << endl;
return 0;
}
else
{
return sizeof(data[0])*MAX;
}
}
运行结果
创建任意数据类型的队列
代码
#include <iostream>
#include <cstring>
#define MAX 5
using namespace std;
template<typename T>
class Stu
{
public:
//构造函数
Stu();
//析构函数
~Stu();
//拷贝构造函数
Stu(const Stu &other);
//判空
bool empty();
//判满
bool full();
//获取队头元素
T get_head();
//入队函数
void init();
//出队函数
void out();
//清空队列
void dele();
//求队列大小
void get_h();
private:
T *data;
int head;
int tall;
};
int main()
{
Stu<int> s0;
s0.init();
s0.out();
cout << "当前对头元素:" << s0.get_head() << endl;
s0.dele();
Stu<char> s1;
s1.init();
s1.out();
cout << "当前对头元素:" << s1.get_head() << endl;
s1.dele();
return 0;
}
//构造函数
template<typename T>
Stu<T>::Stu():data(new T[MAX]),head(0),tall(0){}
//析构函数
template<typename T>
Stu<T>::~Stu()
{
delete []data;
}
//拷贝构造函数
template<typename T>
Stu<T>::Stu(const Stu &other):data(new T[MAX])
{
int i = head;
while ((other.tall+1)%MAX != other.head)
{
data[i] = other.data[i];
i = (i+1)%MAX;
}
}
//判空
template<typename T>
bool Stu<T>::empty()
{
if(head%MAX == tall%MAX)
{
return true;
}
else
{
return false;
}
}
//判满
template<typename T>
bool Stu<T>::full()
{
if(head%MAX == (tall+1)%MAX)
{
return true;
}
else
{
return false;
}
}
//入队函数
template<typename T>
void Stu<T>::init()
{
char q;
if(Stu::full())
{
cout << "队列已满!" << endl;
return;
}
else
{
while((tall+1)%MAX < MAX-1)
{
cout << "请输入数据:";
cin >> data[tall];
while(getchar()!=10);
cout << "入队成功!" << endl;
tall = (tall+1)%MAX;
cout << "是否退出(q):" << endl;
cin >> q;
while(getchar()!=10);
if(q == 'q')
{
break;
}
}
}
}
//出队函数
template<typename T>
void Stu<T>::out()
{
if(Stu::empty())
{
cout << "队列为空!" << endl;
return;
}
else
{
cout << "当前队头元素:" << get_head() << endl;
head = (head+1)%MAX;
cout << "出队成功" << endl;
}
}
//清空队列
template<typename T>
void Stu<T>::dele()
{
if(Stu::empty())
{
cout << "队列为空!" << endl;
return;
}
else
{
head = tall = 0;
}
}
//求队列大小
template<typename T>
void Stu<T>::get_h()
{
cout << "当前队列大小:" << sizeof (data[0])*MAX << endl;
}
//获取队头元素
template<typename T>
T Stu<T>::get_head()
{
if(Stu::empty())
{
cout << "队列为空!" << endl;
return 0;
}
else
{
return data[head];
}
}
运行结果
思维导图