C++:将栈类和队列类都实现成模板类

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.思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值