双向队列 int q[1000],r1=0,f1=0,r2=0,f2=0; 循环队列:手写队列时,约瑟夫问题,使用的内存较大 int q[1000],r=0,f=0,maxnum=20; 入队 q[r++]=x; if(r>=maxnum) r=0; 出队 f++; if(f>=maxnum) f=0; 入队 q[r++%=maxnum]=x; 出队 f++;f%=maxnum; //------------------ stack 和 queue 在c++中都是有工具包 以下的容器也有类似的功能 vector 向量(可变数组),可以当数组用,长度还能改变 创建一个向量,类型为int,变量名为v vector<int> v; 存数据1:push_back() v.push_back(6);//6 v.push_back(3);//6 3 存数据2:下标 v[4]=5;//4下标对应的空间存5 当前向量大小为2,5不属于向量内的数据,但是可以使用 int n; cin>>n; for(int i=0;i<n;i++){ cin>>a; v.push_back(a); } for(int i=0;i<5;i++){ cout<<v[i];63 5 } for(int i=0;i<v.size();i++){ cout<<v[i];//63 } set 集合,关联容器 自动去重,自动升序 set<int> s; int n; cin>>n; for(int i=0;i<n;i++){ cin>>a; s.insert(a); } //set不能使用下标,所以c++提供了遍历数据的迭代器(当成有方向的指针) s.begin();//开头地址 s.end();//结尾地址 for(set<int>::iterator i=s.begin();i!=s.end();i++){ //i++ 是指下一个位置,不是数字+1 cout<<*i<<" "; } /* 指针:存放元素的地址 指针类型必须与元素类型一致 指针指向普通数据类型 指针指向数组 int a[10];//这里的a就是一个指针 int *p=a; cout<<a<<" "<<&a[0]<<" "<<p;//都一样 for(int i=0;i<n;i++) cout<<a[i]; for(int i=0;i<n;i++) cout<<*(a+i); for(int *i=a;n--;i++) cout<<*i; //传入int 数组作为参数 void f(int *a,int n){ //数组的地址开头,以及数组的大小 } //传入vector void f(vector<int> v){ } 指针指向字符数组 char c[10]; char *p; 指针指向字符串 string s="12345"; char *p=&s; cout<<*p;//1 string *p=&s; cout<<*p;"12345" */ map 映射(字典,哈希)自动去重(按key),自动升序(按key) 存值成对儿存在,也叫键值对【key-valve】 map<int,string> m; m[1]="wang"; m[5]="li"; m[3]="zhang"; m[3]="zhao";//zhang被zhao覆盖 m.insert(map<int,string>::value_tpye({4,"wang"})); m.insert(map<int,string>::value_tpye({4,"zhao"}));//存放失败,不会报错 for(map<int,string>::iterator i=m.begin();i!=m.end();i++){ cout<<i->first<<" "<<i->second<<endl; //分别代表key和valve } 输入n,输入n个字符串,输入一个字符串k 询问k是否在n个字符串中,统计出现的次数 map<string,int> m; int n; cin>>n; string s,k; while(n--){ cin>>s; m[s]++; } cin>>k; if(m[k]==0) cout<<"no"; else cout<<"yes"; cout<<m[k];//k出现的次数 multiset 可重复集合,在<set>中,用法与set一致 multimap 可重复映射,在<map>中,用法与map稍微不同,下标用法无法使用 默认理解词 升序:从小到大 降序:从大到小 字典序:从首字母开始按ASCII值从小到大 取模:取余 课上:2004 作业:2075 |