DS静态查找之顺序查找(带哨兵)

DS静态查找之顺序查找(带哨兵)_第1张图片

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

哨兵:

意思就是碰到他就会发出警报,按这个顺序查找的意思就是,如果触发了哨兵,那就是没有查找到相同的元素,没有触碰到就说明找到了。
DS静态查找之顺序查找(带哨兵)_第2张图片
图中3是查找的元素,哨兵也设置为3,放在最前面的位置
我们从后往前查找,找到3就结束。


可以找到:
此时我们的下标index=2,说明找到了,因为他没有碰到哨兵

没有找到:
也会找到一个数值3,但是下标index=0,碰到了哨兵,那就是没有找到

总结:

放置哨兵是一定会找到需要查找的数num的,但是可以判断查找到数num的下标index,如果不是哨兵的位置就说明找到了,如果是哨兵的位置就说明没有找到。


思路:

我们在最开始的0的位置放置哨兵,或者在最末的位置放哨兵。然后遍历,如果碰到哨兵就是没找到,没碰到就说明找到了。

关键代码:

DS静态查找之顺序查找(带哨兵)_第3张图片

全部代码:

#include 
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;
}

你可能感兴趣的:(数据结构)