817 字
4 分钟
链队的应用:连续区间求最小

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

题目#

例: 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

链队的应用:连续区间求最小
https://yuzi.dev/posts/course-notes/monotonic-queue-for-range-minimum
作者
Yuzi
发布于
2021-10-26
许可协议
CC BY-NC-SA 4.0