C++day4

本文展示了一个使用C++模板类实现的顺序栈,包括构造函数、拷贝构造函数、析构函数以及栈的基本操作如push_back、pop_back、size、empty等。myVector类模拟了动态数组的行为,支持动态扩容,并处理了边界检查和异常处理。
摘要由CSDN通过智能技术生成

手动实现顺序栈,要求实现数据结构中,所有栈的相关操作

#include <iostream>
#include<cstring>
#include<sstream>
 
using namespace std;
template <typename T>
 
class myVector
{
private:
    T *first; // 指向第一个元素的指针
    T *last; // 指向最后一个实际元素的指针
    T *end; // 指向可用空间的尾后指针
public:
    myVector():first(nullptr),last(nullptr),end(nullptr) {} //默认构造函数
        myVector(int n, const T& val) //构造函数,初始化n个值为val的元素
        {
            first=new T[n];
            end=first+n;
            last=first+n;
            for(T *p=first;p!=last;p++)
            {
                *p=val;
            }
        }
        myVector(const myVector& v) //拷贝构造函数
        {
            first=new T[v.capacity()];
            end=first+v.capacity();
            last=first+v.size();
            for (T *p1=first,*p2=v.first;p1!=last;p1++,p2++)
            {
                *p1=*p2;
            }
        }
        ~myVector() //析构函数
        {
            delete[] first;
        }
        myVector &operator=(const myVector& v) //拷贝赋值
        {
            if(this==&v)
            {
                return *this;
            }
            delete[] first;
            first=new T[v.capacity()];
            end=first+v.capacity();
            last=first+v.size();
            for(T *p1=first,*p2=v.first;p1!=last;p1++,p2++)
            {
                *p1=*p2;
            }
            return *this;
        }
        T &at(int index) const //获取指定位置的元素,并进行边界检查
        {
            if(index<0||index>=size())
            {
                throw out_of_range("Index out of range");
            }
            return *(first+index);
        }
        bool empty() const //判断向量是否为空
        {
            return size()==0;
        }
        bool full() const //判断向量是否已满
        {
            return size()==capacity();
        }
        T &front() const  //获取向量首元素
        {
            if(!empty())
            {
                return *first;
            }
            throw out_of_range("Vector is empty");
        }
        T &back() const //获取向量尾元素
        {
            if(!empty())
            {
                return *(last-1);
            }
            throw out_of_range("Vector is empty");
        }
        int size() const //获取当前元素个数
        {
            return last-first;
        }
        int capacity() const //获取当前可用空间大小
        {
            return end-first;
        }
        void clear() //清除所有元素
        {
            for(T *p=first;p!=last;p++)
            {
                p->~T();
            }
            last=first;
        }
        void expand() //二倍扩容函数
        {
            int old_capacity=capacity();
            int new_capacity=old_capacity==0?1:old_capacity*2;
            T *new_first=new T[new_capacity];
            T *new_last=new_first+size();
            T *new_end=new_first+new_capacity;
            for(T *p1=new_first,*p2=first;p1!=new_last;p1++,p2++)
            {
                new(p1) T(*p2);
            }
            clear();
            delete[] first;
            first=new_first;
            last=new_last;
            end=new_end;
        }
        void push_back(const T& val) //在向量末尾添加一个元素
        {
            if(full())
            {
                expand();
            }
            new(last) T(val);
            last++;
        }
        void pop_back() //删除向量末尾的一个元素
        {
            if(!empty())
            {
                (last-1)->~T();
                last--;
            }
        }
};
 
int main()
{
    myVector<int> v1; // 默认构造函数
    myVector<int> v2(5,1); // 初始化5个值为1的元素
    myVector<int> v3(v2); // 拷贝构造函数
    v1=v2; // 拷贝赋值
    try
    {
        cout<<"At: "<<v1.at(0)<<endl; //获取指定位置的元素,并进行边界检查
    }
    catch(out_of_range e)
    {
        cout<<e.what()<<endl;
    }
    cout<<"Is empty: "<<v1.empty()<<endl; //判断向量是否为空
    cout<<"Is full: "<<v1.full()<<endl; //判断向量是否已满
    cout<<"Front: "<<v1.front()<<endl; //获取向量首元素
    cout<<"Back: "<<v1.back()<<endl; //获取向量尾元素
    cout<<"Size: "<<v1.size()<<endl; //获取当前元素个数
    v1.clear(); //清除所有元素
    v1.push_back(1); //在向量末尾添加一个元素
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    v1.push_back(5);
    v1.push_back(6); //向量已满,二倍扩容
    v1.pop_back(); //删除向量末尾的一个元素
    cout<<"Size: "<<v1.size()<<endl; //获取当前元素个数
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值