鱼C论坛

 找回密码
 立即注册
查看: 713|回复: 1

[学习笔记] C++快速入门--P46类模板--课上代码

[复制链接]
发表于 2024-2-5 08:50:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
#include <string>

template <class T>
class Stack
{
public:
        Stack(unsigned int size = 100);
        ~Stack();
        void push(T value);
        T pop();
       
private:
        unsigned int size;
        unsigned int sp;
        T *data;
};

template <class T>
Stack<T>::Stack(unsigned int size)
{
        this -> size = size;
        data = new T[size];
        sp = 0;
}

template <class T>
Stack<T>::~Stack()
{
        delete []data;
}

template <class T>
void Stack<T>::push(T value)
{
        data[sp++] = value;
       
}

template <class T>
T Stack<T>::pop()
{
        return data[--sp];
}

int main()
{
        Stack<int> intStack(10);
       
        intStack.push(1);
        intStack.push(2);
        intStack.push(3);
       
        std::cout << intStack.pop() << "\n";
        std::cout << intStack.pop() << "\n";
        std::cout << intStack.pop() << "\n";
       
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-5 08:50:55 | 显示全部楼层
这段代码的功能是实现一个栈类模板(Stack),可以存储任意类型的数据。

首先,我们定义了一个类模板Stack,它有三个成员函数和三个私有成员变量。构造函数Stack(unsigned int size = 100)用于创建一个大小为size的栈对象,默认大小为100。析构函数~Stack()用于释放动态分配的内存。成员函数push(T value)用于将一个值压入栈中。成员函数pop()用于弹出栈顶的值。

然后,我们定义了构造函数、析构函数和成员函数的实现。需要注意的是,在类模板的成员函数外部实现时,需要使用template关键字告诉编译器这是一个类模板的成员函数。

接下来,在main函数中,我们创建了一个Stack对象intStack,并设置大小为10。然后,连续调用push函数将1、2和3压入栈中。

根据代码的逻辑,我们可以看出这是一个有错误的代码示例:

1. 构造函数中,应该使用数组形式的new来分配动态内存,即data = new T[size]。而不是单个元素的new,即data = new T。

2. push函数中,我们应该将新的值存储到栈中的下一个位置上,而不是覆盖掉之前存储的值。

3. pop函数中,应该返回栈顶元素,并将栈顶指针sp减1。而不是直接返回data。

下面是修正后的代码:

#include
#include

template
class Stack
{
public:
    Stack(unsigned int size = 100);
    ~Stack();
    void push(T value);
    T pop();

private:
    unsigned int size;
    unsigned int sp;
    T *data;
};

template
Stack::Stack(unsigned int size)
{
    this->size = size;
    data = new T[size];
    sp = 0;
}

template
Stack::~Stack()
{
    delete[] data;
}

template
void Stack::push(T value)
{
    data[sp] = value;
    sp++;
}

template
T Stack::pop()
{
    if (sp == 0) {
        throw "Stack is empty";
    }
    sp--;
    return data[sp];
}

int main()
{
    Stack<int> intStack(10);
   
    intStack.push(1);
    intStack.push(2);
    intStack.push(3);
   
    std::cout << intStack.pop() << std::endl; // 输出3
    std::cout << intStack.pop() << std::endl; // 输出2
    std::cout << intStack.pop() << std::endl; // 输出1
   
    return 0;
}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 18:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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