STL-容器link、队列、栈、优先队列、bitset得使用

实验目的:

本实验主要练习容器link、队列、栈、优先队列、bitset的使用方法。

实验器材:

VScode

实验内容:

一.回顾以上容器常用函数的使用方法。

二.练习课本第7章的例7.11-7.27。

三.实验报告应包含例7.14、7.18、7.21、7.22、7.26、7.27。

实验步骤:

7.11:初始化

#include<iostream>

#include<string>

#include<list>

using namespace std;

typedef list<string>li;

int main(){

    li l;

    l.push_back("back");

    l.push_front("middle");

    l.push_front("front");

    cout<<l.front()<<endl;

    cout<<*(l.begin())<<endl;

    l.pop_front();

    l.pop_back();

    cout<<l.front()<<endl;

    return 0;

}

7.12:遍历元素

#include<iostream>

#include<list>

using namespace std;

typedef list<int> li;

int main(){

    li l;

    for (int i=0;i<5;i++){

        l.push_back(i+1);

    }

    li::iterator it=l.begin();

    for(it;it!=l.end();it++){

        cout<<*it<<"  ";

    }

    cout<<endl;

    li::reverse_iterator rit=l.rbegin();

    for(rit;rit!=l.rend();rit++){

        cout<<*rit<<"  ";

    }

    cout<<endl;

    return 0;

}

7.13:排序

#include<iostream>

#include<list>

using namespace std;

typedef list<int> li;

void printer(li&la){

    li::iterator it;

    for(it;it!=la.end();it++){

    cout<<*it<<"    ";

    }

    cout<<endl;

}

int main(){

    li l1;

    li l2;

    l1.push_back(2);

    l1.push_back(1);

    l1.push_back(0);

    l1.push_back(6);

    l1.push_back(3);

    l2.push_back(10);

    l2.push_back(9);

    l2.push_back(4);

    l2.push_back(5);

    l2.push_back(7);

    l2.push_back(11);

    l1.sort();

    l2.sort();

    printer(l1);

    printer(l2);

    l2.splice(l2.begin(),l1);

    printer(l2);

    l2.merge(l1);

    printer(l2);

    cout<<l1.size()<<"\t"<<l2.size()<<endl;

    return 0;

}

7.14:综合

#include<iostream>

#include<list>

#include<string>

using namespace std;

class Student{

    private:

    string m_strno;

    string m_name;

    string m_college;

    int m_grade;

    public:

    Student(string strno,string name,string college,int grade):m_strno(strno),m_name(name),m_college(college),m_grade(grade){}

    bool operator<(Student& s){

        return m_strno<s.getno();

    }

    bool operator==(Student & s){

        return m_strno==s.getno();

    }

    string getno(){

        return m_strno;

    }

    string getname(){

        return m_name;

    }

    string getcollege(){

        return m_college;

    }

    int getgrade(){

        return m_grade;

    }

};

ostream& operator<<(ostream&os,Student&s){

    os<<s.getcollege()<<"\t"<<s.getgrade()<<"\t"<<s.getname()<<"\t"<<s.getno();

    return os;

}

typedef list<Student>li;

class Stumange{

    private:

    li l1;

    public:

    bool add(Student&s){

        l1.push_back(s);

        return true;

    }

    void Merge(Stumange &s){

        l1.sort();

        s.l1.sort();

        l1.merge(s.l1);

        l1.unique();

    }

    void show(){

        li::iterator it=l1.begin();

        for(it;it!=l1.end();it++){

            cout<<*it<<"\t"<<endl;

        }

    }

};

int main(){

    Stumange m1,m2;

    Student s1("2021","liyi","shanda",650);

    Student s2("2020","like","tsghua",696);

    Student s3("1988","liwei","taili",500);

    Student s4("2019","linan","beida",670);

    Student s5("2022","lishuai","sjiao",666);

    m1.add(s1);

    m1.add(s2);

    m1.add(s3);

    m2.add(s5);

    m2.add(s3);

    m2.add(s4);

    m2.add(s1);

    m2.add(s2);

    m1.Merge(m2);

    m1.show();

    return 0;

}

7.17:队列的基本操作

#include<iostream>

#include<queue>

#include<list>

#include<string>

#include<deque>

using namespace std;

template<class T,class Container>

void printqueue(queue<T,Container>obj){

    while(!obj.empty()){

        cout<<obj.front()<<"\t";

        obj.pop();

    }

    cout<<endl;

}

int main(){

    queue<int,list<int>>s;

    for(int i=0;i<4;i++){

        s.push(i+1);

    }

    printqueue(s);

    queue<string,deque<string>>a;

    string str="b";

    for(int i=0;i<4;i++){

        a.push(str);

        str+="a";

    }

    printqueue(a);

    return 0;

}

7.18:固定大小的堆栈

#include<iostream>

#include<stack>

#include<deque>

using namespace std;

template<class T,class container=deque<T>>

class mystack:public stack<T,container>{

    private:

    int m_size;

    public:

    mystack(int maxsize){

        m_size=maxsize;

    }

    void push(const T& s){

        if(stack<T,container>::size()<m_size){

            stack<T,container>::push(s);

        }

        else{

            cout<<"the stack is full"<<endl;

        }

    }

};

int main(){

    mystack<int,deque<int>>obj(2);

    obj.push(1);

    obj.push(2);

    obj.push(3);

    return 0;

}

7.20:

#include<iostream>

#include<queue>

#include<algorithm>

#include<iterator>

using namespace std;

int main(){

    int a[]={1,2,3,4,5,6,7,8,9,10};

    priority_queue<int> pr(a,a+9);

    pr.push(a[10]);

    cout<<"进队顺序:";

    copy(a,a+10,ostream_iterator<int>(cout,"\t"));

    cout<<endl;

    cout<<"出队顺序:";

    while(!pr.empty()){

        cout<<pr.top()<<"\t";

        pr.pop();

    }

    cout<<endl;

    return 0;

}

7.21:

#include<iostream>

#include<queue>

#include<string>

using namespace std;

class Student{

    private:

    int m_no;

    string m_name;

    int m_chinese;

    int m_math;

    public:

    // Student(int no,string name,int chinese,int math):m_no(no),m_name(name),m_chinese(chinese),m_math(math){}

    Student(int m_no,string m_name,int m_chinese,int m_math){

        this->m_no=m_no;

        this->m_name=m_name;

        this->m_chinese=m_chinese;

        this->m_math=m_math;

    }

    int getno()const{return m_no;}

    string getname()const{return m_name;}

    int getchinese()const{return m_chinese;}

    int getmath()const{return m_math;}

    bool operator<(const Student&s)const{

        int sum1=m_chinese+m_math;

        int sum2;

        int chinese2=s.getchinese();

        int math2=s.getmath();

        sum2=chinese2+math2;

        if(sum1<sum2) return true;

        if((sum1==sum2)&&(m_chinese<chinese2)) return true;

        return false;

    }

};

int main(){

    Student a[]={Student(1,"lihua",99,100),Student(2,"zhnag",97,100),Student(3,"wangw",100,100),Student(4,"zhoaliu",89,89)};

    priority_queue<Student> pr(a,a+4);

    cout<<"the grade from high to low's sort:"<<endl;

    cout<<"no\tname\tchinese\tmath"<<endl;

    while(!pr.empty()){

        const Student&t=pr.top();

        cout<<t.getno()<<"\t"<<t.getname()<<"\t"<<t.getchinese()<<"\t"<<t.getmath()<<endl;

        pr.pop();

    }

    return 0;

}

7.22

#include<iostream>

#include<queue>

using namespace std;

template<class T,class cont=vector<T>,class pred=less<typename cont ::value_type>>

class Flixepriority_queue:public priority_queue<T,cont,pred>{

    private:

    int nsize;

    public:

    Flixepriority_queue(int nsize){

        this->nsize=nsize;

    }

    bool push(T&s){

        if(this->size()<nsize){

            priority_queue<T,cont,pred>::push(s);

            return true;

        }

    return false;

    }

};

int main(){

    Flixepriority_queue<int>pr(10);

    for(int  i=0;i<15;i++){

        if(!pr.push(i)){

            cout<<"the priority_queue is full"<<"\t"<<i<<"di i ge yuan su is not insert"<<endl;

        }

    }

    return 0;

}

7.27:

#include<iostream>

#include<bitset>

#include<fstream>

using namespace std;

template<size_t  n>

class Mynum{

    public:

    bitset<n>b;

    void set(int ary[],int nsize){

        b.reset();

        for(int i=0;i<nsize;i++){

            b.set(ary[i]-1,1);

        }

    }

};

int main(){

    int a[6][10]={{1,2,3,4,5,6,7,8,9,10},{2,4,6,7,8,9,3,0,11,12},{1,3,56,76,44,2,21,11,12,34},{43,41,25,31,56,56,54,33,66,63},{78,79,90,98,97,96,94,92,19,42},{38,39,30,20,29,38,36,99,85,77}};

    ofstream out("F:\\STL\\a.txt");

    Mynum<24>m;

    for(int i=0;i<6;i++){

        m.set(a[i],10);

        out.write((char*)&m.b,3);

        cout<<i<<"\t";

    }

    out.close();

    return 0;

}

实验结果(附数据和图表):

7.13

.

7.14

7.17

7.18

7.20

7.21

7.22

实验结果分析及结论:

Link可以方便地进行节点的插入、删除和查找等操作;队列是一种先进先出的数据结构,而栈是先进后出的结构;优先队列是一种支持按优先级进行排序的数据结构;bitset是一种固定大小的位集数据结构,可以有效地处理二进制位操作。

实验心得体会和建议:

  本实验主要练习了容器link、队列、栈、优先队列和bitset的使用方法。

据实验知:link是一种双向链表,可以用于实现各种数据结构,如双向链表、双向循环链表等,以提高数据的查询、插入和删除的效率。也掌握了队列,栈,优先队列和bitset的基本操作,队列是一种先进先出(FIFO)的数据结构,可以有效地处理需要按照特定顺序处理的任务,在实际应用中,队列可以用于实现各种任务调度算法,如打印机的打印队列、服务器的任务调度等。

综上所述,通过此次实验,我深入了解了容器link、队列、栈、优先队列和bitset的使用方法。这些数据结构和算法在计算机科学中有着广泛的应用,掌握它们对于提高编程能力和解决实际问题具有重要的意义。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值