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

这篇具有很好参考价值的文章主要介绍了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.思维导图

C++:将栈类和队列类都实现成模板类,c++,算法,开发语言文章来源地址https://www.toymoban.com/news/detail-733552.html

到了这里,关于C++:将栈类和队列类都实现成模板类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • List集合以及它的实现类和队列、栈

    Collection层次的结构接口中,一些允许有重复的元素,例如:List接口。而另外一些不允许有重复的元素,例如:Set接口。其中也分为了有序与无序的(存储顺序)。 在JDK中没有提供Collection接口的实现类,但是提供了更加具体的子接口(如Set、List和Queue接口)。 现在我们具体

    2023年04月13日
    浏览(46)
  • 算法模板之单调栈和单调队列图文详解

    🌈个人主页: 聆风吟 🔥系列专栏: 算法模板、数据结构 🔖少年有梦不应止于心动,更要付诸行动。      💬 hello! 各位铁子们大家好哇,今天作者给大家带来了单调栈和单调队列的算法模板讲解,让我们一起加油进步。      📚 系列专栏:本期文章收录在《算法

    2024年02月02日
    浏览(46)
  • C++数据结构与算法详解:链表、栈、队列、树、二叉树和图结构的实现与应用

    链表是一种常见的数据结构由一系列节点按顺序连接而成,一般每个节点包含一个数据元素和一个指向下一个节点的引用。 链表有多种类型: 单向链表:每个节点只有一个指向下一个节点的引用 双向链表:每个节点有一个指向前一个节点和一个指向后一个节点的引用 循环链

    2024年02月04日
    浏览(52)
  • 数据结构与算法—二叉树数组表示(ArrayBinTree)、二叉树的链式表示(LinkedBinTree)的基于C++模板代码实现

    1、二叉树的顺序表示:ArrayBinTree.h 二叉树的顺序表示法操作方便,但缺点是容易造成存储空间浪费。 这是一个用数组实现的二叉树类模板。它可以创建一个空树,也可以在指定的位置插入结点并设置结点的值,可以删除子树,并支持逐层遍历。使用该类时,需要提供一个元

    2024年02月06日
    浏览(44)
  • 多级反馈队列调度算法(c++)

    如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是)  (骗一下数据,说不定以后面试就过了,拜谢) 操作系统基本调度算法,多级反馈队列调度算法。在划分时间片的调度算法中,多级反馈队列算法兼顾提高系统吞吐率和及减少进程饥饿。设置多个反馈队列,

    2024年02月09日
    浏览(37)
  • 【C++类和对象】日期类的实现

    hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥 个人主页 :大耳朵土土垚的博客 💥 所属专栏 :C++入门至进阶 这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖 通过下面的学习我们将构建简单日期计算器的各种

    2024年04月23日
    浏览(51)
  • C++数据结构与算法——栈与队列

    C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注! 请你仅使用两个栈实现先入先出队列。队列应当

    2024年02月20日
    浏览(45)
  • C++类和对象 练习小项目---日期类的实现.

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::为了更好的理解 C++ 类和对象的知识,我们可以动手实现一下 C++ 的一个简单的日期类,完成相应的函数,更好的帮助我们理解类和对

    2024年02月14日
    浏览(34)
  • 【Spring】Spring 可以将接口所实现的类都注入到接口类型的List、Map中

    Spring 提供了依赖注入的功能,可以通过注解或者配置来实现将接口的实现类注入到接口类型的 List、Map 中。 @Autowired 是重点!除此之外, @RequiredArgsConstructor 也可以代替他的功能。参考【注解】@RequiredArgsConstructor 按需自动生成构造函数,举例说明 Spring自动扫描组件 : 如果你

    2024年01月23日
    浏览(61)
  • 【C++算法模板】图论-拓扑排序,超详细注释带例题

    推荐视频链接:D01 拓扑排序 给定一张 有向无环图 ,排出所有顶点的一个序列 A A A 满足:对于图中的每条有向边 ( x , y ) (x,y) ( x , y ) , x x x 在 A A A 中都出现在 y y y 之前,则称 A A A 是该图的顶点的一个拓扑序 拓扑排序 可以判断有向图中是否有环,可以生成拓扑序列 对于下

    2024年04月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包