1.栈的源代码:
#include <iostream>
using namespace std;
template<typename T>
class Stack
{
private:
T* arr;
int top;
int max;
public:
// 无参构造
Stack() : arr(nullptr), top(-1), max(0) {}
// 有参构造
Stack(int size)
{
if (size > 0)
{
max = size;
arr = new T[max];
top = -1;
cout << "栈容量设置成功" << endl;
}
else
{
cout << "输入有误,栈的容量必须大于0" << endl;
}
}
// 拷贝构造
Stack(const Stack& other) : top(other.max), max(other.max)
{
if (this != &other)
{
arr = new T[max];
for (int i = 0; i < top + 1; i++)
{
arr[i] = other.arr[i];
}
}
}
// 析构函数
~Stack()
{
delete[] arr;
}
// 入栈
void push(T value)
{
if (!isFull())
{
arr[++top] = value;
cout << value << " 入栈成功" << endl;
}
else
{
cout << "栈满,无法入栈" << endl;
}
}
// 出栈
T pop()
{
if (!isEmpty())
{
return arr[top--];
}
else
{
cout << "栈空,无法出栈" << endl;
return T(); // 返回默认值
}
}
// 清空栈
void clear()
{
top = -1;
}
// 判空
bool isEmpty()
{
return top == -1;
}
// 判满
bool isFull()
{
return top == max - 1;
}
// 获取栈顶元素
T getTop()
{
if (!isEmpty())
{
return arr[top];
}
else
{
cout << "栈空,无法获取栈顶元素" << endl;
return T();
}
}
// 求栈的大小
int getSize()
{
return top + 1;
}
};
int main()
{
Stack<string> stringStack(10);
stringStack.push("hello");
stringStack.push("world");
cout << "栈的大小为: " << stringStack.getSize() << endl;
cout << "栈顶元素为: " << stringStack.getTop() << endl;
cout << stringStack.pop() << " 出栈成功" << endl;
cout << "出栈一次后栈的大小为: " << stringStack.getSize() << endl;
return 0;
}
2.队列源代码
#include <iostream>
#define MAX 5
using namespace std;
template <typename T>
class Queue{
public:
//构造
Queue();
//析构
~Queue();
//拷贝构造
Queue(const Queue &other);
//入队
int push(T e);
//出队
int pop();
//清空队
void clear();
//判空
bool empty();
//判满
bool full();
//求大小
int size();
private:
int front;
int tail;
T *data;
};
//构造函数
template <typename T>
Queue<T>::Queue():front(0),tail(0),data(new T[MAX])
{
cout<<"构造函数"<<endl;
}
//析构函数
template <typename T>
Queue<T>::~Queue(){
delete []data;
cout<<"析构"<<endl;
}
//拷贝构造函数
template <typename T>
Queue<T>::Queue(const Queue &other):front(other.front),
tail(other.tail),
data(new T[MAX]){
std::copy(other.data,other.data+MAX,data);
cout<<"拷贝构造"<<endl;
}
//入队
template <typename T>
int Queue<T>::push(T e){
if(Queue<T>::full()){
cout<<"队满;"<<endl;
return 0;
}
data[tail]=e;
cout<<e<<"入队"<<endl;
tail=(tail+1)%MAX;
return 1;
}
//出队
template <typename T>
int Queue<T>::pop(){
if(Queue<T>::empty()){
cout<<"队空"<<endl;
return 0;
}
cout<<data[front]<<"出队"<<endl;
front=(front+1)%MAX;
return 1;
}
//清空队列
template <typename T>
void Queue<T>::clear(){
cout<<"清空队"<<endl;
while(!Queue<T>::empty()){
Queue<T>::pop();
}
}
//判空
template <typename T>
bool Queue<T>::empty(){
return front==tail;
}
//判满
template <typename T>
bool Queue<T>::full(){
return (tail+1)%MAX==front;
}
//求队列大小
template <typename T>
int Queue<T>::size(){
cout<<this<<"队列大小:";
return (tail-front+MAX)%MAX;
}
int main()
{
Queue<int> que;
que.push(1);
que.push(2);
que.push(3);
cout<<que.size()<<endl;
Queue<int> q2=que;
cout<<q2.size()<<endl;
Queue<int> q3=q2;
cout<<q2.size()<<endl;
q2.clear();
q2.pop();
cout<<q2.size()<<endl;
cout<<que.size()<<endl;
return 0;
}
3.思维导图文章来源:https://www.toymoban.com/news/detail-733552.html
文章来源地址https://www.toymoban.com/news/detail-733552.html
到了这里,关于C++:将栈类和队列类都实现成模板类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!