C++杂项

作业:

将之前实现的顺序表、栈、队列都更改成模板类

顺序表

#include <iostream>

using namespace std;

template<typename T>

class SeqList
{
private:
    T *ptr;
    int size;             //总长度
    int len = 0;          //当前顺序表实际长度

public:
    //初始化
    void init(int n)
    {
        this->ptr = new T[n];
        this->len = 0;
        this->size = n;
    }

    //判空
    bool empty()
    {
        return this->len == 0;
    }
    //判满
    bool full()
    {
        return this->len == this->size;
    }
    //尾插
    void push_back(T e)
    {
        //判断是否满了
        if(this->full())
        {
            return ;
        }

        this->ptr[len++] = e;
    }
    //插入
    void insert(T index)
    {
        //判断是否满了
        if(this->full())
        {
            return ;
        }
        int i,pos;
        cout << "pos>>";
        cin >> pos;
        for(i=this->len; i>=pos; i--)
        {
            this->ptr[i] = this->ptr[i-1];
        }
        this->ptr[i] = index;
        this->len++;
    }
    //任意位置删除
    void del(int index)
    {
        if(empty() == 1)
        {
            return;
        }
        int i;
        for(i = index - 1; i < this->len; i++)
        {
            this->ptr[i] = this->ptr[i+1];
        }
        this->len--;
    }
    //尾删
    void pop_back(int index)
    {
        if(empty() == 1)
        {
            return;
        }
        int i;
        for(i = 0; i < index; i++)
        {
            this->ptr[this->len--] = 0;
        }
    }
    //求长度
    void my_size()
    {
        cout << "len = " << this->len <<endl;
    }
    //获取任意位置元素
    T & at(int index)
    {
        static T num;
        num = this->ptr[index-1];
        return num;
    }
    //将顺序表进行排序
    void sort(bool flag)
    {
        int i,j;
        if(flag)
        {
            for(i = 0; i < this->len; i++)
            {
                for(j = 0; j < this->len - 1- i;j++)
                {
                    if(this->ptr[j]>this->ptr[j+1])
                    {
                        T temp = this->ptr[j];
                        this->ptr[j] = this->ptr[j+1];
                        this->ptr[j+1] = temp;
                    }
                }
            }
        }
        else
        {
            for(i = 0; i < this->len; i++)
            {
                for(j = 0; j < this->len - 1- i;j++)
                {
                    if(this->ptr[j]<this->ptr[j+1])
                    {
                        T temp = this->ptr[j];
                        this->ptr[j] = this->ptr[j+1];
                        this->ptr[j+1] = temp;
                    }
                }
            }
        }
    }
    //定义展示函数
    void show()
    {
        //判空
        if(empty() == 1)
        {
            return;
        }
        for(int i=0; i<this->len; i++)
        {
            cout<<this->ptr[i]<<" ";
        }
        cout<<endl;
    }
};
int main()
{
    SeqList<int> s1;           //实例化一个顺序表对象
    s1.init(10);
    s1.show();
    s1.insert(8);
    s1.insert(7);
    s1.insert(9);
    s1.insert(2);
    s1.show();
    cout<<s1.at(2)<<endl;
    s1.del(1);
    s1.show();
    return 0;
}

运行结果:

#include <iostream>

using namespace std;

template<typename T>
class Stack  //定义一个栈的模板类
{
private:
    T *ptr;   //栈
    int num;  //栈顶元素数
    int max;  //栈的空间初始大小
public:
    Stack():num(-1),max(20){
        ptr = new T[max];   //申请空间
    }
    Stack(int t,int m):num(t),max(m){
        ptr = new T[max];   //申请栈空间
        for(int i=0;i<num+1;i++)
        {
            cout<<"input>>";
            cin>>ptr[i];
        }
    }
    ~Stack(){
        delete [] ptr;
    }
    Stack(Stack &s):ptr(new T(*s.ptr)),num(s.num),max(s.max){}
    //栈顶元素访问
    T top()
    {
        return ptr[num];
    }
    //判空
    bool empty()
    {
        return num==-1;
    }
    //元素数
    int size()
    {
        return num+1;
    }
    //向栈顶插入元素
    void push(T n)
    {
        //判满
        if(num==max-1)
        {
            cout<<"full"<<endl;
            return;
        }
        ++this->num;
        this->ptr[num] = n;
    }
    //删除栈顶元素
    void pop()
    {
        //判空
        if(empty())
        {
            return;
        }
        this->num--;
    }
    void show()
    {
        for(int i=0;i<num+1;i++)
        {
            cout<<ptr[i]<<"  ";
        }
        cout<<endl;
    }
};
int main()
{
    Stack <string> s1(4,10);   //有参构造
    s1.show();
    s1.pop();
    s1.show();

    string buff;
    cout<<"push>>";
    cin>>buff;
    s1.push(buff);
    s1.show();
    cout<<s1.size()<<"  "<<s1.top()<<endl;
    return 0;
}

运行结果:

队列

#include <iostream>
#include <stack>
using namespace std;
//队列模板类
template<typename T>
class Queue
{
private:
    int max;      //队列最大容量
    int num;      //队列内元素数
    T *ptr;     //容器
public:
    Queue():max(20),num(0){
        ptr = new T[this->max];
    }
    ~Queue(){
        delete [] ptr;           //释放空间
    }
    Queue(Queue &q):max(q.max),num(q.num),ptr(new T(*q.ptr)){}    //深拷贝
   T front()
   {
       if(empty())
       {
           cout<<"null"<<endl;
           T a;
           return a;
       }
       return ptr[0];
   }
   T back()
   {
       if(empty())
       {
           cout<<"null"<<endl;
           T a;
           return a;
       }
       return ptr[num-1];
   }
   bool empty()
   {
       return num==0;
   }
   int size()
   {
       return num;
   }
   void push(T n)
   {
       //判满
       if(num>=max)
       {
           cout<<"full"<<endl;
           return;
       }
       this->num++;
       this->ptr[num-1] = n;
   }
   void pop()
   {
       //判空
       if(empty())
       {
           cout<<"null"<<endl;
           return;
       }
       for(int i=0;i<this->num;i++)
       {
           this->ptr[i]=this->ptr[i+1];
       }
       this->num--;
   }
   void show()
   {
       for(int i=0;i<num;i++)
       {
           cout<<ptr[i]<<"  ";
       }
       cout<<endl;
   }
};
int main()
{
    Queue<string> q;
    //判空
    if(q.empty())
    {
        q.push("hello");
        q.push("world");
        q.push("I");
        q.push("love");
        q.push("china");
        q.show();
    }
    cout<<q.back()<<endl;
    cout<<q.front()<<endl;
    cout<<q.size()<<endl;
    q.pop();
    q.show();
    return 0;
}

运行结果:

知识梳理:

C++11新特性之智能指针(重要)

相关推荐
唐诺3 小时前
几种广泛使用的 C++ 编译器
c++·编译器
冷眼看人间恩怨4 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客4 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin4 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos5 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室6 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0016 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我586 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc6 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
呆萌很7 小时前
C++ 集合 list 使用
c++