队列的三种实现(静态数组、动态数组及指针)

  本文有关栈的介绍部分参考自网站数据结构

  1. 队列

   1.1 队列的定义

  队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。

  

  (1)允许删除的一端称为队头(Front)
  (2)允许插入的一端称为队尾(Rear)
  (3)当队列中没有元素时称为空队列
  (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表
     队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队。
 【例】在队列中依次加入元素a1,a2,…,an之后,a1是队头元素,an是队尾元素。退出队列的次序只能是a1,a2,…,an

   1.2 队列的运算

  (1)initQueue(Q)
     置空队。构造一个空队列Q。

  (2)isEmpty(Q)
     判队空。若队列Q为空,则返回真值,否则返回假值。

  (3) isFull(Q)
     判队满。若队列Q为满,则返回真值,否则返回假值。
    注意:
     此操作只适用于队列的顺序存储结构。

  (4) enQueue(Q,x)
     若队列Q非满,则将元素x插入Q的队尾。此操作简称入队

  (5) deQueue(Q)
     若队列Q非空,则删去Q的队头元素,并返回该元素。此操作简称出队

  (6) front(Q)
     若队列Q非空,则返回队头元素,但不改变队列Q的状态。

  2. 实现

  在实现的时候,队列的基本函数都有(isEmpty、enQueue、deQueue、front)。因为我是用面向对象的方法来设计队列,所以队列的初始化、拷贝构造、赋值运算符重载等也都具备。另外,我采取了C++中的模板类来设计队列,使得队列设计能适应更多的场合。

  队列的实现跟栈的实现没什么大的区别,只需代码细小的修改就OK了。所以,在这里,我只给出基于静态数组的队列的设计。

  2.1 基于静态数组  

  基于静态数组的队列的最大特点就是队列的大小是固定的,用户在初始化之后就无法改变。在编译期,编译器就已经给这个队列分配好内存,在“内存的栈”上分配。

  这是我所设计的队列模板类:

 1 template<class T, int defCapacity = 1024>
 2 class Queue
 3 {
 4 public:
 5     Queue();
 6     virtual ~Queue();
 7     bool isEmpty();
 8     bool enQueue(T val);       // 通过在队尾添加一个值来改变队列。
 9     T front();                 // 访问队首的值,保持队列不变。
10     bool deQueue();            // 通过删除队首的值来改变一个队列。
11     int getSizeOfQueue();
12
13 private:
14     T queue[defCapacity];
15     int sizeOfQueue;
16
17 };

  具体实现代码为:

 1 #include <iostream>
 2 #include <cassert>
 3 using namespace std;
 4
 5 // const int CAPACITY = 1024;
 6
 7 template<class T, int defCapacity = 1024>
 8 class Queue
 9 {
10 public:
11     Queue();
12     virtual ~Queue();
13     bool isEmpty();
14     bool enQueue(T val);    // 通过在队尾添加一个值来改变队列。
15     T front();                // 访问队首的值,保持队列不变。
16     bool deQueue();            // 通过删除队首的值来改变一个队列。
17     int getSizeOfQueue();
18
19 private:
20     T queue[defCapacity];
21     int sizeOfQueue;
22
23 };
24
25
26 template<class T, int defCapacity>
27 Queue<T, defCapacity>::Queue()
28 {
29     sizeOfQueue = 0;
30 }
31
32 template<class T, int defCapacity>
33 Queue<T, defCapacity>::~Queue()
34 {
35
36 }
37
38 template<class T, int defCapacity>
39 bool Queue<T, defCapacity>::isEmpty()
40 {
41     return sizeOfQueue == 0;
42 }
43
44 template<class T, int defCapacity>
45 bool Queue<T, defCapacity>::enQueue(T val)
46 {
47     // assert(sizeOfQueue < defCapacity);
48     bool isSuccess = true;
49     if (sizeOfQueue == defCapacity)
50     {
51         cerr << "There is no space for new elements." << endl;
52         isSuccess = false;
53     }
54     else
55     {
56         queue[sizeOfQueue] = val;
57         sizeOfQueue++;
58     }
59     return isSuccess;
60 }
61
62 template<class T, int defCapacity>
63 T Queue<T, defCapacity>::front()
64 {
65     //assert(sizeOfQueue > 0);
66     if (sizeOfQueue == 0)
67     {
68         cerr << "There is no elements in the queue." << endl;
69     }
70     return queue[0];
71 }
72
73 template<class T, int defCapacity>
74 bool Queue<T, defCapacity>::deQueue()
75 {
76     // assert(sizeOfQueue > 0);
77     bool isSuccess = true;
78     if (sizeOfQueue == 0)
79     {
80         cerr << "There is no element in Queue." << endl;
81         isSuccess = false;
82     }
83     else
84     {
85         for (int i = 0; i < sizeOfQueue - 1; i++)
86         {
87             queue[i] = queue[i + 1];
88         }
89         sizeOfQueue--;
90     }
91     return isSuccess;
92 }
93
94 template<class T, int defCapacity>
95 int Queue<T, defCapacity>::getSizeOfQueue()
96 {
97     return sizeOfQueue;
98 }

queue.hpp

  Boost单元测试代码为:

 1 #define BOOST_TEST_MODULE Stack_Test_Module
 2
 3 #include "stdafx.h"
 4 #include "../Queue/queue.hpp"
 5
 6 const int MAXSIZE = 3;
 7 struct Stack_Fixture
 8 {
 9 public:
10     Stack_Fixture()
11     {
12         testQueue = new Queue<int, MAXSIZE>();
13     }
14
15     ~Stack_Fixture()
16     {
17         delete testQueue;
18     }
19
20     Queue<int, MAXSIZE> * testQueue;
21 };
22
23
24
25 BOOST_FIXTURE_TEST_SUITE(Stack_Test_Fixture, Stack_Fixture)
26
27 BOOST_AUTO_TEST_CASE(Queue_Test)
28 {
29     // isEmpty ------------------------------------
30     BOOST_REQUIRE(testQueue->isEmpty() == true);
31
32     // isEmpty ------------------------------------
33     BOOST_REQUIRE(testQueue->getSizeOfQueue() == 0);
34
35     // enQueue & front ---------------------------------
36     BOOST_REQUIRE(testQueue->enQueue(1) == true);
37     BOOST_REQUIRE(testQueue->front() == 1);
38     BOOST_REQUIRE(testQueue->getSizeOfQueue() == 1);
39
40     BOOST_REQUIRE(testQueue->enQueue(2) == true);
41     BOOST_REQUIRE(testQueue->front() == 1);
42     BOOST_REQUIRE(testQueue->getSizeOfQueue() == 2);
43
44     BOOST_REQUIRE(testQueue->enQueue(3) == true);
45     BOOST_REQUIRE(testQueue->front() == 1);
46     BOOST_REQUIRE(testQueue->getSizeOfQueue() == 3);
47
48     BOOST_REQUIRE(testQueue->enQueue(3) == false);
49     BOOST_REQUIRE(testQueue->front() == 1);
50     BOOST_REQUIRE(testQueue->getSizeOfQueue() == 3);
51
52     // deQueue & front ----------------------------------
53     BOOST_REQUIRE(testQueue->deQueue() == true);
54     BOOST_REQUIRE(testQueue->front() == 2);
55     BOOST_REQUIRE(testQueue->getSizeOfQueue() == 2);
56
57     BOOST_REQUIRE(testQueue->deQueue() == true);
58     BOOST_REQUIRE(testQueue->front() == 3);
59     BOOST_REQUIRE(testQueue->getSizeOfQueue() == 1);
60
61     BOOST_REQUIRE(testQueue->deQueue() == true);
62     BOOST_REQUIRE(testQueue->getSizeOfQueue() == 0);
63
64     BOOST_REQUIRE(testQueue->deQueue() == false);
65
66 }
67
68
69 BOOST_AUTO_TEST_SUITE_END()

BoostUnitTest.cpp

  2.2 基于动态数组

  请参考栈的三种实现(静态数组、动态数组及指针)2.2

  2.3 基于指针

  请参考栈的三种实现(静态数组、动态数组及指针)2.3

  本篇博文的代码均托管到Taocode : http://code.taobao.org/p/datastructureandalgorithm/src/.

时间: 2024-10-10 14:11:36

队列的三种实现(静态数组、动态数组及指针)的相关文章

三种方法求最大子数组的和

这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8. 下面按照时间复杂度逐步优化的顺序依次给出这三种算法. 暴力求解法 该方法的思想非常简单,先找出从第1个元素开始的最大子数组,而后再从第2个元素

Delphi-基础(常量、集合、数组[动态数组、多维数组])

一.常量 1.常量定义:一开始定义好的值,以后在程序的运行过程中不允许改变 1 const 2 Pi : Double = 3.141592; //定义为常量 3 {常量的定义方式,可以不进行类型的声明,编译器会根据具体值决定常量的的类型} 4 Pi2 = 3.1415; 2.常量使用 枚举:常量集 type 枚举名=(标识符1,标识符2,标识符3,......) 1 type 2 {正常情况下,枚举类型的索引是从0开始} 3 EColors = (RED,GREEN,BLUE); 4 EWee

三种方法求解两个数组的交集

package com.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; //求两个数组的交集 public class FindIntersectionBetweenTwoArrays { //算法一:暴力搜索,时间复杂度O(n^2),空间复杂度O(1) public ArrayList

三种方法打印列表(数组)

#方法一 member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88] i=0 lenth=len(member) while i<lenth: print(member[i],member[i+1]) i+=2 #方法二 member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88] i=0 for string in member: print(member[i],m

c#清空数组&amp;初始化数组&amp;动态数组

清空数组>>>Array.Clear [去MSDN查看] 1 string[] str = new string[2]; 2 for (int i = 0; i < str.Length; i++) 3 str[i] = i.ToString(); 4 Array.Clear(str, 0, str.Length); 5 for (int i = 0; i < str.Length; i++) 6 Console.WriteLine(string.IsNullOrEmpty(

C++函数的三种传递方式为:值传递、指针传递和引用传递

值传递: void fun(int x){ x += 5; //修改的只是y在栈中copy x,x只是y的一个副本,在内存中重新开辟的一块临时空间把y的值 送给了x:这样也增加了程序运行的时间,降低了程序的效率. } void main(void){ int y = 0; fun(y); cout<<\"y = \"<<y<<endl; //y = 0; } 指针传递: void fun(int *x){ *x += 5; //修改的是指针x指向的内

11月30日 四种网卡配置,三种防火墙配置

四种方式配置网卡 1.1 [[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736   查找网卡配置文件 HWADDR=00:0C:29:44:05:A7   网卡物理地址(mac地址) TYPE=Ethernet   网卡类型:以太网 BOOTPROTO=dhcp   网卡地址获取方式三种:静态,动态,默认.现在是动态获取,改为none. DEFROUTE=yes PEERDNS=yes PEERRO

数组的三种方式总结、 多维数组的遍历及 Arrays类的常用方法总结

一.数组的三种方式总结 1.创建数组 Java语言使用new操作符来创建数组,语法如下: arrayRefVar = new dataType[arraySize]; 上面的语法语句做了两件事: 一.使用 dataType[arraySize] 创建了一个数组. 二.把新创建的数组的引用赋值给变量 arrayRefVar. 数组变量的声明,和创建数组可以用一条语句完成,如下所示: dataType[] arrayRefVar = new dataType[arraySize]; 另外,你还可以使

WEB开发教程--ASP中静态数组与动态数组的用法

在ASP中,数组是具有相同名字的一组变量,数组中包含多个元素,由不同的下标值区分数组的各个元素.在VBScript中,数组有两种类型:静态数组和动态数组. 1.静态数组 静态数组在编译时开辟内存区,数组大小在运行时不可改变. 定义一个一维数组mmArray(3) Dim mmArray(3) mmArray(0)=1 mmArray(1)=3 mmArray(2)=5 mmArray(3)=7 其中mmArray是数组名,数组的下界为0,上界为3,数组元素从mmArray(0)到mmArray(