LOADING

加载过慢请开启缓存 浏览器默认开启

链队的应用:连续区间求最小

2021/10/26 数据结构

一个数据结构的链队小练习

题目

例:
2 3 5 6 1 4 7
前4数最小为2,2-5数为1,3-6为1,4-7为1
给出一个数组,给出n,输出每一组n个数的最小值

代码

创建链队

typedef struct QNode
{
    int data;
    struct QNode *next;
} QNode, *QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
} Link;

以很合理的方式创建了一个链队。

创建一个类

class Quene
{
private:
    Link Q;
    int n;
    int a[100];
    int length;
public:
    Quene(int a[], int length, int n);
    Quene();
    ~Quene();
    void makequeue()
};

用一个类封装了一下所有的数据及函数。
构造函数采用了重载,分为预设数据和手动输入数据。

构造函数[从键盘输入数据]

Quene::Quene()
{
    length = 0;
    cout << "\nPlease enter the array:" << endl;
    while (cin >> a[length])//从键盘获取数组,同时得到数组长度
    {
        length++;
        if (cin.get() == '\n')
            break;
    }
    cout << "Please enter n: ";
    cin >> n;
    Q.front = Q.rear = new QNode;
    Q.front->next = NULL;//初始化链队
}

构造函数[使用默认数据]

Quene::Quene(int a[], int length, int n)
{
    Q.front = Q.rear = new QNode;//初始化链队
    Q.front->next = NULL;
    this->length = length;
    this->n = n;
    for (size_t i = 0; i < length; i++)
    {
        this->a[i] = a[i];//从传入的参数获取数组,长度,n
    }
}

进行比较的函数

void makequeue()
    {
        int min = 0;
        for (int i = 0; i < n; i++)//将前n个数据放入链队
        {
            QueuePtr p = new QNode; //入队元素开辟空间
            p->data = a[i];         //置数1
            p->next = NULL;
            Q.rear->next = p; //新节点插入队尾
            Q.rear = p;       //修改新节点指针
            if (!i)
            {
                min = p->data;
            }
            else if (p->data < min)//比较出最小的那一个数并输出
            {
                min = p->data;
            }
        }
        cout << min << " ";
        for (size_t i = n; i < length; i++)//对于剩下的数,每一次循环,从队尾新加一个数,将队头的数移出,然后进行比较大小
        {
            /*——————入队——————*/
            QueuePtr p = new QNode; //入队元素开辟空间
            p->data = a[i];         //置数1
            p->next = NULL;
            Q.rear->next = p; //新节点插入队尾
            Q.rear = p;       //修改新节点指针
            /*——————出队——————*/
            p = Q.front->next;
            Q.front->next = p->next; //更新头指针
            p = Q.front->next;       //为下面的比较大小而重置p
            min = p->data;           //重置最小值
            while (p->next)
            {
                if (p->next->data < min)
                {
                    min = p->next->data;
                }
                p = p->next;
            }
            cout << min << " ";//比较大小,然后再输出最小值,重置参数min,然后进入下一次循环
            min = 0x7fffffff; //最小值置最大;
        }
    }

main函数

int main()
{
    int a[100] = {2, 3, 4, 5, 6, 114514, 9, 4, 5, 7, 1919810, 655, 66, 4500, 37, 19, 23, 298, 13, 2};
    int length = 20;
    int n = 4;
    Quene q(a, length, n);
    q.makequeue();
    /*————手动输入数据————*/
    Quene manual;
    manual.makequeue();
}

总结

  当元素出队时,可以最小值进行比较,若大于最小值,则下一次循环比较大小时无需将前三项数据进行比较,而是直接用原先的min与入队数据相比较,可以减少比较的次数。

  本篇代码:https://github.com/Yuzi0201/Data-structure/blob/master/2-queue.cpp