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

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

@[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的增减情况发生了变化,原来只需要++现在变成了++后还要取模运算,而其实在取模运算的过程就是一个循环的过程。

总结

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

相关文章
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
39 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
7月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)二
46 2
|
7月前
|
存储 算法
数据结构和算法学习记录——设计循环队列(数组实现循环队列)核心思路、题解过程、完整题解
数据结构和算法学习记录——设计循环队列(数组实现循环队列)核心思路、题解过程、完整题解
59 1
|
8月前
|
算法 测试技术
【数据结构与算法 | 基础篇】环形数组模拟队列
【数据结构与算法 | 基础篇】环形数组模拟队列
|
7月前
|
算法 C语言
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
数据结构和算法学习记录——栈和队列习题-用队列实现栈、用栈实现队列(核心思路、解题过程、完整题解)一
45 0
|
8月前
|
消息中间件 算法 调度
数据结构与算法——单向循环列表、栈和队列(附代码)
数据结构与算法——单向循环列表、栈和队列(附代码)
50 2
|
程序员
【LeetCode232】用栈模拟实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false
|
存储 算法 Java
java数据结构,一个案例带你用数组模拟队列,环形队列!
java数据结构,一个案例带你用数组模拟队列,环形队列!
152 0
java数据结构,一个案例带你用数组模拟队列,环形队列!
|
存储 算法 小程序
数据结构与算法——第三节 链表(单向不循环不带头+双向循环带头 C实现+源码剖析+运行+思路分析)
可以看到 ,我如果要吧黑球插入到白球里面,显然,我要把7号位的球移到8号位,5号位的球移到6号位...然后最后才能把2号位的求插进去。如果有N个数据,那么它的算法的时间复杂度达到了O(N)!
124 0
|
算法
数据结构与算法-数组模拟队列
数据结构与算法-数组模拟队列
105 0
数据结构与算法-数组模拟队列