队列的C++实现(数组)——创建-进队-出队-返回队首元素-清空队列栈-处理队列

队列的数组实现,从队尾进入,对头删除。

队列长度用标志变量size,它是独立于front和rear的一个变量。size == 0,队列为空。size == capacity,满队列。

一、结点声明

1 struct Node{
2         int Capacity;
3         int Front;
4         int Rear;
5         int Size;
6         int *Array;
7     };
8 typedef struct Node Queue;

Capacity队列容量;Front,Rear为队列首元素和尾元素的数组下标;Size为当前队列大小;Array指向整形数组的指针,存放队列元素。

二、非空判断

1 int queue::isEmpty(Queue *Q)
2 {
3     return Q->Size == 0;    //独立于Q->Rear和Q->Front存在的一个标志
4 }

三、满队列判断

1 int queue::isFull(Queue *Q)
2 {
3     return (Q->Size == Q->Capacity );
4 }

四、创建队列

 1 queue::Queue *queue::createQueue(int maxElements)
 2 {
 3     cout << "Please input the value of maxElements: " << endl;
 4     scanf_s("%d", &maxElements);
 5     if (maxElements < minQueueSize)
 6     {
 7         cout << "The size of queue is too small!" << endl;
 8         return 0;
 9     }
10     else
11     {
12         Queue *Q;
13         Q = (Queue *)new(Queue);
14         if (Q == NULL)
15             cout << "Out of space!" << endl;
16         Q->Array = new int[maxElements];
17         if (Q->Array == NULL)
18             cout << "Out of space!" << endl;
19
20         Q->Capacity = maxElements;
21         Q->Front = 1;
22         Q->Rear = 1;   // Rear预初始化为1
23         Q->Size = 0;   // 空队列标志
24         makeEmpty(Q);
25         return Q;
26     }
27 }

五、清空队列

1 void queue::makeEmpty(Queue *Q)
2 {
3     if (isEmpty(Q))
4         cout << "Donnot need to makeEmpty the queue!" << endl;
5     Q->Size = 0;   //  空队列标志,初始状态下标如下
6     Q->Front = 1;
7     Q->Rear = 0;  
8 }

六、循环队列实现

1 int queue::isCycle(int value, Queue *Q)
2 {
3     if (++value == Q->Capacity)     //下标从0开始,故下标为Capacity,表示循环队列的第一个元素,即下标为0
4         return 0;
5     return value;             下标小于Capacity,可正常自增
6 }

七、进队列

 1 queue::Queue *queue::enQueue(Queue *Q)
 2 {
 3     if (isFull(Q))
 4         cout << " Full queue! " << endl;
 5     else
 6     {
 7         int x = 0;
 8         cout << "Please input the number to enQueue!" << endl;
 9         scanf_s("%d", &x);     // 取地址符
10         Q->Size++;
11         Q->Rear = isCycle(Q->Rear,Q);    // 循环队列自增
12         Q->Array[Q->Rear] = x;
13     }
14     return Q;     // 满队列则返回原队列,未满则进入队列后返回该队列
15 }

八、返回队首元素

1 int queue::front(Queue *Q)
2 {
3     return Q->Array[Q->Front];            //只返回队首元素,不出队列
4 }

九、出队列

 1 queue::Queue *queue::deQueue(Queue *Q)
 2 {
 3     if (isEmpty(Q))
 4         cout << "Empty queue! " << endl;
 5     else
 6     {
 7         cout << "The front element of queue is :" << Q->Array[Q->Front] << endl;
 8         Q->Front++;
 9         Q->Size--;
10     }
11     return Q;
12 }

十、处理队列

1 void queue::disposeQueue(Queue *Q)
2 {
3     while (!isEmpty(Q))
4     {
5         Q->Size = 0;    //循环终止条件
6         free(Q->Array);
7         free(Q);
8     }
9 }
时间: 2024-11-09 00:29:21

队列的C++实现(数组)——创建-进队-出队-返回队首元素-清空队列栈-处理队列的相关文章

栈和队列总结

一 基础知识 1. 均为线性表,可以由数组或链表实现 栈:先进后出,操作均在栈顶进行 队列:先进先出,队尾进,队首出 2.  STL stack & queue stack 常见操作: s.push(x):入栈 (void类型) s.pop(): 出栈 (void类型,只删除,不返回元素) s.top(): 返回栈顶元素 s.size():返回栈元素个数 s.empty() :判断栈是否为空 queue 常见操作: q.push(x): 入队 q.pop(): 出队 (void类型,只删除,不返

大话数据结构之三(栈和队列)

栈的定义 栈是仅限有表尾进行插入和删除操作的线性表 允许插入和删除操作的一端称为栈顶,别一端称为栈底.不包含任何数据元素的栈称为空栈.栈又称为先进后出(Last In First Out)的线性表,简称为LIFO结构. 栈的插入操作叫做进栈,也称压栈.入栈. 栈的删除操作叫做出栈,也称弹栈 栈的抽象数据类型 栈的顺序存储结构 栈的插入和删除操作和时间复杂度均是O(1) 栈的不同状态下的示意图: 栈的实现源码如下: #include "stdio.h" #include "st

数据结构习题之栈和队列

第三章  栈和队列 一.    基本要求.重点.难点 本章的目的是介绍栈和队列的逻辑结构定义及在两种存储结构上如何实现栈和队列的基本运算.要求在掌握栈和队列的特点的基础上,懂得在什么样的情况下能够使用栈或队列.本章重点是掌握栈和队列在两种存储结构上实现的基本运算,难点是循环队列中对边界条件的处理. 二.    考核目标和考核要求 要求达到识记层次的有:栈和队列的特点,什么样的情况下能够使用栈或队列 要达到综合应用层次的有:栈的逻辑结构特点,栈与线性表的异同:顺序栈和链栈上实现的进栈.退栈等基本算

利用栈实现队列(C语言实现)

在上一篇优化后队列的实现(C语言实现)  中,虽然我们对队列的时间复杂度进行了优化,但是却让代码的可读性变差了,代码显得略微臃肿(当然,这些话你看看就好,主要是为了奉承这篇博文的). 这里主要实现的是:利用栈来实现队列 基本思路: 1,创建两个栈 2,两个栈合并起来组装成一个队列,分别取名为instack,outstack,用于进队列,出队列 3,比如有1,2,3,4,5 需要进入队列,先将这一串数压入instack栈中,假设压入顺序为1,2,3,4,5(1为栈底),再将instack中的数据移

线性表 及Java实现 顺序表、链表、栈、队列

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高.同时,它也是软考的重点,我们需要对这部分的内容进行一下总结. 我们先看一下数据结构和算法的整体内容. 1.线性表 概念: 数据元素的排列方式是线性的. 分类: 分类规则是根据上图中元素的存储结构来划分的. (1)顺序表 基本思想:元素的存储空间是连续的.在内

STL栈、队列、优先队列—————基础知识

0基本特点:后进先出(LIFO) 注意: 不一定最先进栈的最后出栈,只要保证是栈顶元素出栈就行! 当栈中存在一个元素时,top=0,因此通常把空栈的判定条件定为top= - 1: STL 中栈的使用方法: 头文件:#include <stack> 基本操作: push(x) 将x加入栈中,即入栈操作 pop() 出栈操作(删除栈顶),只是出栈,没有返回值 top() 返回第一个元素(栈顶元素) size() 返回栈中的元素个数 empty() 当栈为空时,返回 true STL 中队列的使用(

数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的"物理存储结构",另一种是数据的"逻辑存储结构".数据的"物理存储结构"又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树

数据结构学习笔记(特殊的线性表:栈与队列)

栈与队列 栈是限定仅在表尾(栈顶)进行插入和删除操作的线性表(后进先出).队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(先进先出). 栈(Stack): 1.下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作为栈底.定义一个top变量来指示栈顶元素在数组中的位置.栈顶位置top必须小于存储栈长度StackSize,把空栈的判定条件定位top等于-1. 2.进栈与出栈操作(顺序存储结构): 进栈操作push:/*插入元素e为新的栈顶元素*/Status Pu

数据结构之栈和队列及其Java实现

栈和队列是数据结构中非常常见又非常基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用两个栈实现队列和用两个队列实现栈. 栈:栈是一种基于"后进先出"策略的线性表.在插入时(入栈),最先插入的元素在栈尾,最后插入的元素在栈顶:在删除时(出栈),最后插入的元素先出栈,最先插入的元素最后出栈.由此可见,对栈的插入和删除操作都是在栈顶位置进行的. 在Java中,提供了一个类Stack<E>来实现栈的这些特性,并提供了一些常用的