查看: 706|回复: 0

[原创图文] C++ 模板 栈和队列的数据结构

[复制链接]

35

主题

47

帖子

3

精华

解密专家

Rank: 16

学币
380
荣耀
0
rank
0
违规
0
发表于 2021-1-31 20:31:28 | 显示全部楼层 |阅读模式
本帖最后由 鸦领主 于 2021-1-31 20:31 编辑

1、C++模板技术也叫泛型技术:
泛型就是使用的类型是各种类型,运算过程相同。
在模板技术出现之前,主要使用define和重载函数实现泛型。
2、函数模板定义:
template <class 模板变量>
template <typename 模板变量>//俩个都是一样定义哪一个都行
返回值函数(模板变量...)
3、模板函数的调用:
a)标准调用:
函数名<模板类型>(参数列表);
根据指定模板类型生成对应的函数。
b)非标准调用:根据参数类型自动识别生成一个新的类型的函数。
函数名(参数列表);

2.俩个小的数据结构
栈的数据结构
栈是线性结构,特点是先进后出
输入12345.输出就是54321

#pragma once
template<typename DATA>//模板
class CStack
{
    DATA *m_pdata;
    int nTop;
    int m_Count;
public:
    CStack(int count=5)//缺省是5
    {
        m_pdata = new DATA[count];
        nTop = 0;
        m_Count = count;
    }
    ~CStack()
    {
        delete[]m_pdata;
    }
    bool isFull()//判断栈是否满了
    {
        return nTop >= m_Count;
    }
    void push(const DATA& data)//入栈
    {
        if (!isFull())
            m_pdata[nTop++] = data;
    }
    bool isEmpty()//判断栈是否空了
    {
        return nTop == 0;
    }
    bool pop(DATA& data)//出栈
    {
        if (isEmpty())
            return false;
        data = m_pdata[--nTop];
        return true;
    }
};
<div>
</div><div>队列的数据结构</div><div>队列是线性结构,先进先出环形结构,需要多余出来一个位置
template<typename DATA>//模板
class Queue //队列
{
    DATA* m_pdata;
    int m_nHead, m_nTail;
    int m_Count;
public:
    Queue(int count = 5)
    {
        m_pdata = new DATA[count];
        m_nHead = m_nTail = 0;
        m_Count = count + 1;//加1是多余出来一个位置
    }
    bool isFull()//判断是否满了//②再次进入判断此时Tail是0+1,Count是6,余数是1,1==2不符合可以进入if ,③此时Tail是1+1,Count是6,余数是2,2==2不能进入if 而m_nTail[1]将会变成新的空位
    {    //①当你要输入5次的话,因为下面有一个count+1那么就是6,那么m_nTail会加加5次,将5个内容一次送入目的也达到了,
        return (m_nTail + 1)%m_Count == m_nHead; //①此时m_nTail是5+1(加1是不让多出的位置用掉) 余6,余数是0和m_Head相等,就不再会进入if里面了
    }       //②如果用pop取出俩个数字,那么m_nHead会加俩次变成2, 0==2的就不会成立,将再次进入if        
    void push(const DATA& data)//入栈
    {
        if (!isFull())
        {//②取出来的数字将会赋值到多余的位置上也就是m_pdata[5]上面
            m_pdata[m_nTail] = data;  //将内容赋值给m_pdata[0],m_pdata[1]...m_pdata[4]②data将会赋值给m_pdata[0]
            m_nTail = ++m_nTail % m_Count;//②这一步6%6余数0赋值给m_Taill   ③Tail加加会变成1
        }    
    }
    bool isEmpty()//判断是否空了
    {
        return m_nHead == m_nTail;
    
    }
    bool pop(DATA& data)//出栈
    {
        if (isEmpty())//第一次进入m_nHead(2)==m_nTail(1)不成立不进入  第四次进入m_nHead(5)==m_nTail(1)不成立不进入 第六次进入m_nHead(5)==m_nTail(1) 最后一次1==1不再进入if
            return false;
        data = m_pdata[m_nHead];//第一次将m_pdatap[2]内容赋值给data    第五次m_pdatap[5]内容赋值给data    第六次m_pdatap[0]内容赋值给data
        m_nHead = ++m_nHead % m_Count;//第一次++m_nHead(3)%m_Count(6)余数为3赋值给m_nHead   第五次++m_nHead(6)%m_Count(6)余数为0赋值给m_nHead 第六次++m_nHead(1)%m_Count(6)余数为1赋值给m_nHead
        return true;
    }
};</div>

C++ 模板 栈和队列的数据结构

C++ 模板  栈和队列的数据结构

C++ 模板 栈和队列的数据结构

C++ 模板  栈和队列的数据结构


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
学逆向论坛-免费的逆向学习论坛
关闭

论坛公告上一条 /1 下一条

快速回复 返回顶部 返回列表