• 构建队列,数组版本


    队列作为基本的数据结构,是每个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;
    }
  • 相关阅读:
    Log4J日志整合及配置详解
    SmartGit/Hg 4.0.1 发布
    Test Kitchen 0.7.0支持在OpenStack上对Opscode Chef进行集成测试
    RubyGNOME2 1.2.0 发布,支持 GTK+ 3
    PowerDNS Recursor 3.5 RC1 发布
    用于展现图表的50种JavaScript库
    Lambda表达式现状分析
    Node.js 0.8.18 / 0.9.7 发布
    CRUX 3.0 发布,轻量级 Linux 发行版
    Google 更新浏览器内的手写识别技术
  • 原文地址:https://www.cnblogs.com/tz346125264/p/7436492.html
Copyright © 2020-2023  润新知