码迷,mamicode.com
首页 > 编程语言 > 详细

构建队列,数组版本

时间:2017-08-26 23:37:23      阅读:375      评论:0      收藏:0      [点我收藏+]

标签:必须掌握   main   场景   ges   ror   首部   9.png   clu   ace   

队列作为基本的数据结构,是每个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;
}

 

构建队列,数组版本

标签:必须掌握   main   场景   ges   ror   首部   9.png   clu   ace   

原文地址:http://www.cnblogs.com/tz346125264/p/7436492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!