实验目的:
本实验主要练习容器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的使用方法。这些数据结构和算法在计算机科学中有着广泛的应用,掌握它们对于提高编程能力和解决实际问题具有重要的意义。