哈希表 开放寻址法原理:先让数x对应到坑k,如果这个坑位有元素,就让k++,寻找的时候也是,先找x对应的坑位k,如果这个坑位有元素但不是x,就让k++,继续往后找
#include<iostream>
#include<cstring>
using namespace std;
const int N = 200003/*N一般选择大于数据范围的第一个质数*/, null = 0x3f3f3f3f;
int h[N];//坑位数组,存放元素
int find(int x){
int k = (x % N + N) % N;
while(h[k] != null && h[k] != x){//如果x对应的k坑位已被占,切占据该坑的呀元素不是x,就令k++,寻找下一个坑 (如果x对应的k坑没有被占,则不用进入该循环 )
k ++ ;
if(k == N) k = 0;//如果找到最后一个坑都被占且不相等,就从第一个坑开始找
}
return k;//最终返回x所在的坑的下标
}
int main()
{
int n;
cin>>n;
memset(h, 0x3f, sizeof(h));//初始化所有坑位的值!!!这一步很重要!!!不能忘!!!
while(n -- ){
char op[2];
int x;
scanf("%s%d", op, &x);//以字符串形式读入命令字符,防止样例给出多余空格
int k = find(x);//找到x对应的坑位下标k
if(op[0] == 'I'){
h[k] = x;//给k坑赋值为x
}
else if(op[0] == 'Q'){
if(h[k] == null){
cout<<"No"<<endl;//如果k坑的数据为无限大,表明x不在哈希表中
}
else{
cout<<"Yes"<<endl;
}
}
}
return 0;
}