用数组实现FIFO队列

#include<iostream>
using std::cout;
using std::endl;
using std::string;
// queue implemented as an array
template<class T, int size = 100>
class ArrayQueue {
public:
    ArrayQueue() { 
        first = last = -1; 
    }
    void enqueue(T);
    T dequeue();
    bool isFull()  { 
        return first == 0 && last == size-1 || first == last + 1; 
    }
    bool isEmpty() { 
        return first == -1; 
    }
private:
    int first; // point to the first element that can be take away from the queue.
    int last; // point to the last element that was put into the queue recently.
    T storage[size];
};
template<class T, int size>
void ArrayQueue<T,size>::enqueue(T el) {
   if (!isFull())
        if (last == size-1 || last == -1) {
            storage[0] = el;
            last = 0;
            if (first == -1)
                first = 0;
        }
        else storage[++last] = el;
   else cout << "Full queue.\n";
}
// Please do check "!ifEmpty()" before invoke this API, else a SIGSEGV error will happen.
template<class T, int size>
T ArrayQueue<T,size>::dequeue() {   
    T tmp;
    tmp = storage[first];
    if (first == last)
         last = first = -1;
    else if (first == size-1)
         first = 0;
    else first++;
    return tmp;
}
int main()
{
    ArrayQueue<string, 5> strArray;
    strArray.enqueue("what ");
    strArray.enqueue("is ");
    strArray.enqueue("your ");
    strArray.enqueue("name? ");
    strArray.enqueue("I ");
    strArray.enqueue("am ");
    strArray.enqueue("Frank.");
    while(!strArray.isEmpty()){
        cout << strArray.dequeue();
    }
    cout << endl;
    
    // When queue is empty, dequeue() will cause segmentation fault.
    //cout << strArray.dequeue();
    return 0;
}
时间: 2024-10-12 05:50:38

用数组实现FIFO队列的相关文章

FIFO 队列的链表和数组实现

FIFO (First-in, First-out,先进先出)队列:当执行delete操作时删除那些呆在队列中时间最长的元素. FIFO 队列是这样一个ADT,包含两个基本操作:插入(put)一个新的项.删除(get)一个最早插入的项. 一.FIFO队列的链表实现 FIFO 队列和下堆栈的区别在于新项的插入是在尾部,而不是在头部.因此实现程序要保存一个指向链表最后一个节点的尾指针tail ,因此当Put操作时,将tail 指针指向的next 指向新节点,然后更新tail指针,让它指向那个新的节点

文件 FIFO队列

<?php /** * Filefifo.php 文件型FIFO队列 */ class Filefifo { /** * $_file_data, 数据文件的路径 */ private $_file_data = ''; /** * $_file_idx, 索引文件的路径 */ private $_file_idx = ''; /** * $_file_idx_bak, 索引备份文件的路径, 防止意外断电等导致索引文件破坏 */ private $_file_idx_bak = ''; /**

教你如何使用Java手写一个基于数组实现的队列

一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作.队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加. 在Java中队列又可以分为两个大类,一种是阻塞队列和非阻塞队列. 1.没有实现阻塞接口: 1)实现java.util.Queue的LinkList, 2)实现java.util.Abstra

C语言实现使用动态数组实现循环队列

我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作.由于数组的大小已经被指定,无法动态的扩展.所以在这篇博客中,我换成动态数组来实现.动态数组可以不断开辟内存空间,只是会在数组的初始化时有所不同,其他对数组的操作都是一样的.代码上传至 https://github.com/chenyufeng1991/Queue_DynamicArray . (1)声明变量 static int *queue;//声明数组 static int maxSize;//数组大

自定义数组列表和队列

最近一直在研究数据结构与算法,涉及到自定义数组和队列,感觉对JDK源代码的底层功能实现学习有一定的帮助,故作此总结,以供参考. ps:JDK的源代码更加复杂,我的自定义数组列表和队列只是一些简单的逻辑实现. 1.自定义数组列表(MyArrayList.java) package com.BlueStarWei.arrayList; /** * * show all fields and method,please click "ctrl + o" * * * 开发过程遇到的问题: *

zookeeper应用 - FIFO 队列 分布式队列

使用ZooKeeper实现的FIFO队列,这个队列是分布式的. package fifo; import java.util.Collections; import java.util.List; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeep

抽象数据类型总结:复数 adt 和 FIFO 队列adt

定义:抽象数据类型(abstract data type, ADT)是指"只"通过接口进行访问的数据类型.我们将那些使用ADT的程序叫做客户,将那些确定数据类型的程序叫做实现. 客户程序除了通过接口中提供的那些操作外,并不访问任何数据值.数据的表示和操作都在接口的实现里,和客户完全分离. 数据结构.数据类型和抽象数据类型 数据结构.数据类型和抽象数据类型,这3个术语在字面上虽不同但相近,反映出它们在含义上既有区别又有联系. 数据结构 数据结构是计算机科学与技术领域常用的术语.它用来反映

java中使用FIFO队列:java.util.Queue实现多台服务器发邮件的代码

代码下载地址:http://www.zuidaima.com/share/1838230785625088.htm 原文:java中使用FIFO队列:java.util.Queue实现多台服务器发邮件的代码 最近由于zuidaima.com注册用户的增多,qq企业邮箱发送邮件会被封禁账号导致注册后面的用户收不到周总结,所以紧急开发了一套多账号,多服务器发送邮件的程序. 大概的设计思路如下: 1.服务器可以无限扩展,但由于qq企业邮箱是限定域名,所以要想多服务器还得有多域名,多账号也不行. 2.最

FIFO队列管理多个Dialog显示

项目中我们有时会遇到这样一种场景,首页中加载数据要弹出一个加载对话框,加载完数据之后可能要弹出一个定位城市的选择确认框,或者个人喜好设置对话框,或者感兴趣的栏目订阅选择对话框.为了便于管理dialog,取消前一个对话框后再显示下一个对话框,我们可以用FIFO队列对dialog进行排队. private Queque<Dialog> dialogQueue = new LinkedList<>(); private Dialog currentDialog = null; // 当前