构建队列,数组版本

Posted Stphen糖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建队列,数组版本相关的知识,希望对你有一定的参考价值。

队列作为基本的数据结构,是每个coder所必须掌握的。

队列在逻辑上就像是一条打饭的长队,排在前面的先打到饭(先进先出)。

这里用一个数组用以构造一个队列,并设置两个指向,head指向队首,tail指向队尾,初始状态是head与tail指向同一位置(队列为空)

队列有两个操作:入队与出队。

1.入队:对比打饭排队的场景,新来的人排在后面,这是队尾tail需向后移一位。

2.出队:已经打好饭的人就可以出去了,这时队头也需向后移一位,让后面的人成为队头。

注意:

当head与tail都移到数组末端,又该如何?

数组虽然在逻辑上已经为空,但是已经没有办法再入队了!

所以我们需要拿出地圆思想,把该数组看做一个没有首尾限制的空间,即数组最后一位的下一位就是第一位(如何让head与tail从数组尾部变为首部?取余操作即可)。

那么队列如果满了该如何判别:tail后一位指向若是head,那么就为满(因为head之后,tail之前的空间此时都已被占用,这两段空间是相连的)

代码如下:

#include<iostream>
using namespace std;

//队列数组 
/*队列数组优化方案: 
    为保证数组空间被充分利用,可不遵守数组的首末位置为队列的首末位置
    而是设置首末端指向:head,tail;将数组看做一个首末相连的空间 
    head指向的便是队列头部,tail指向尾部
    若head与tail指向同一位置,那么说明队列为空
    若head在tail前一个位置,说明队列已满 
*/
int a[10];
int head = 0;
int tail = 0; 

void insert(int value){
    int temp = (tail+1)%10;
    if(temp==head){
        throw "queue full error";
    }
    a[tail]=value;
    tail=temp;
}

int dequeue(){
    if(tail == head){
        throw "queue empty error";
    }
    int value = a[head];
    head = (head+1)%10;
    return value;
}

int main(){
    while(1){
        cout<<"这里是一个队列结构,1.入队,2.出队"<<endl<<"请输入:";
        int select;
        cin>>select;
        if(select==1){
            cout<<"请输入入队值:";
            int value;
            cin>>value;
            insert(value);
        } else{
            cout<<"队首为:"<<dequeue()<<endl;
        }
    }
    return 0;
}

 

以上是关于构建队列,数组版本的主要内容,如果未能解决你的问题,请参考以下文章

如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?

# Java 常用代码片段

# Java 常用代码片段

perl中的队列

图解为什么要使用线程池?

JDK常用数据结构