竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解

简介: 竞赛:图解循环数组--借助循环数组进行队列的模拟实现以及循环数组的理解讲解

@[TOC]

队列的模拟实现

队列是什么

队列是一种数据结构,遵循的是先进先出,后进后出的原则,基于这个原则我们可以借助数组进行模拟实现。

实现过程

实现原理

借助两个变量head和tail模拟实现队列的队头和队尾,出队列即让head++,入队即让tail++,即可借助数组实现模拟的队列过程

具体代码实现

#include <iostream>
using namespace std;
#define max 5

int queue[max] = { 0 };
int head = 0;
int tail = 0;

void Push(int num)
{
    if (tail >= max)
    {
        cout << "full!" << endl;
    }
    else
    {
        queue[tail] = num;
        tail++;
        cout << "successfully!" << endl;
    }
}

void Pop()
{
    if (head >= tail)
    {
        cout << "empty!" << endl;
    }
    else
    {
        head++;
        cout << "sucessfully!" << endl;
    }
}

void Display()
{
    for (int i = head; i < tail; i++)
    {
        cout << queue[i] << " ";
    }
    cout << endl;
}

int main()
{
    int num = 0;
    int opt = 1;
    while (opt)
    {
        cout << "1.push 2.pop 3.display 0.exit" << endl;
        cout << "your choice:->" << endl;
        cin >> opt;
        switch (opt)
        {
        case 1:
            cout << "your num:->";
            cin >> num;
            Push(num);
            break;
        case 2:
            Pop();
            break;
        case 3:
            Display();
            break;
        default:
            cout << "try again" << endl;
        }
    }
    return 0;
}

那么事实上,这样做确实可以达到目的,通过运行可以发现达到了最开始的想法,pop和push可以实现队列的整个过程

但与此同时,问题在于对于数组的利用有很大问题,出队后前面的部分就被荒废了,如果数组满了想要继续入队是不可行的,那么如何把这部分内容利用起来?于是我们就想到可以把前面的循环利用一下,这样就引出了循环数组的概念。

循环数组

循环数组是什么?

循环数组就是相当于把数组变成一个环形的数组,可以不断向里面存储内容

循环数组如何实现队列?

实现原理

我们要进行循环数组的原因就是前面的部分不能被充分利用,那么我们假设空出来一个格子不利用,专门用来进行循环。

图解如下:

在这里插入图片描述

由上图可以知道循环数组的原理就是少存储一个格子,而这个格子就是我们用来循环使用的,当tail指向最后一个格子而前面head没有出队的时候,此时就是队满了,而当head向前推进时,tail就可以循环到前面第一个格子,核心就是怎么进行这样的循环。
循环的原理就是head=(head+1)%maxn
maxn就是数组的大小。

//循环数组实现队列的模拟实现

#include <iostream>
using namespace std;
#define maxn 5

int queue[maxn];
int head = 0;
int tail = 0;

void Push(int num)
{
    queue[tail] = num;
    tail = (tail + 1) % maxn;
}

int Pop()
{
    int r = queue[head];
    head = (head + 1) % maxn;
    return r;
}

void Display()
{
    for (int i = head; i != tail; i = (i + 1) % maxn)
    {
        cout << queue[i] << " ";
    }
    cout << endl;
}

int main()
{
    int opt = 1;
    while (opt)
    {
        cout << "1.push 2.pop 3.display 0.exit" << endl << "your choice:->";
        cin >> opt;
        int num = 0;
        switch (opt)
        {
        case 1:
            if ((tail + 1) % maxn == head)
            {
                cout << "队列已满" << endl;
            }
            else
            {
                cin >> num;
                Push(num);
            }
            break;
        case 2:
            int r;
            if (head == tail)
            {
                cout << "队列为空" << endl;
            }
            else
            {
                r = Pop();
                if (r != -1)
                    cout << r << " has pop" << endl;
            }
            break;
        case 3:
            Display();
            break;
        default:
            cout << "重新选择" << endl;
        }
    }
    return 0;
}

从这里看到和前面的比起来有一些区别,区别在于head和tail的增减情况发生了变化,原来只需要++现在变成了++后还要取模运算,而其实在取模运算的过程就是一个循环的过程。

总结

循环数组确实提供了一个全新思路,在很多题目中可以用循环数组解决一些看似很难的问题。
如有不对请多多指正。

相关文章
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
21 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
6月前
|
算法 测试技术
【数据结构与算法 | 基础篇】环形数组模拟队列
【数据结构与算法 | 基础篇】环形数组模拟队列
|
6月前
|
算法
栈刷题记(二-用栈操作构建数组)
栈刷题记(二-用栈操作构建数组)
|
存储 C++
C/C++顺序与链式队列详解(附代码)(一)
C/C++顺序与链式队列详解(附代码)
214 0
|
存储 C语言 C++
C/C++顺序与链式队列详解(附代码)(二)
C/C++顺序与链式队列详解(附代码)
145 0
|
Cloud Native Go
1441. 用栈操作构建数组:简单模拟+栈思想
这是 力扣上的 1441. 用栈操作构建数组,难度为 中等。
|
调度
leetcode.1114-按序打印-多线程案例
leetcode.1114-按序打印-多线程案例
108 0
|
机器学习/深度学习 算法
LeetCode算法小抄--数组各种花式遍历技巧
LeetCode算法小抄--数组各种花式遍历技巧
|
存储 算法 Java
java数据结构,一个案例带你用数组模拟队列,环形队列!
java数据结构,一个案例带你用数组模拟队列,环形队列!
143 0
java数据结构,一个案例带你用数组模拟队列,环形队列!
|
存储 算法 JavaScript
日拱算法:环形数组是否存在循环
存在一个不含 0 的 环形 数组 nums ,每个 nums[i] 都表示位于下标 i 的角色应该向前或向后移动的下标个数: 如果 nums[i] 是正数,向前(下标递增方向)移动 |nums[i]| 步 如果 nums[i] 是负数,向后(下标递减方向)移动 |nums[i]| 步