Description
给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始
要求使用带哨兵的顺序查找算法
Input
第一行输入n,表示队列有n个数据
第二行输入n个数据,都是正整数,用空格隔开
第三行输入t,表示有t个要查找的数值
第四行起,输入t个数值,输入t行
Output
每行输出一个要查找的数值在队列的位置,如果查找不成功,输出字符串error
Sample
#0
Input
Copy
8 33 66 22 88 11 27 44 55 3 22 11 99
Output
Copy
3 5 error
哨兵:
意思就是碰到他就会发出警报,按这个顺序查找的意思就是,如果触发了哨兵,那就是没有查找到相同的元素,没有触碰到就说明找到了。
图中3是查找的元素,哨兵也设置为3,放在最前面的位置
我们从后往前查找,找到3就结束。
可以找到:
此时我们的下标index=2,说明找到了,因为他没有碰到哨兵
没有找到:
也会找到一个数值3,但是下标index=0,碰到了哨兵,那就是没有找到
总结:
放置哨兵是一定会找到需要查找的数num的,但是可以判断查找到数num的下标index,如果不是哨兵的位置就说明找到了,如果是哨兵的位置就说明没有找到。
思路:
我们在最开始的0的位置放置哨兵,或者在最末的位置放哨兵。然后遍历,如果碰到哨兵就是没找到,没碰到就说明找到了。
关键代码:
全部代码:
#include <iostream>
using namespace std;
const int maxn = 1e5 + 10;
int shuzu[maxn];
int main()
{
int n;
while (cin >> n)
{
for (int i = 1; i <= n; i++)//我采用的是将哨兵放置在0的位置
{
cin >> shuzu[i];
}
int t;
cin >> t;
while (t--)
{
int num;
cin >> num;//输入要查找的数字
shuzu[0] = num;///将哨兵放在0的位置
int i = n;
for (i = n; shuzu[i] != num; i--);///遍历数组,查找到就结束shuzu[i]==num时结束
if (i != 0)///哨兵在0的位置,所以i非0就说明查找到了
{
cout << i << endl;
}
else///i为0说明没有查找到
{
cout << "error" << endl;
}
}
}
return 0;
}