一、概念

顺序结构实现队列,就是用数组来实现,使用front和rear两个变量来确定队头和队尾的位置,和链式结构不同的是这里front和rear是数组下标而不是指针。初始化时将rear和front都初始化为0,这个条件同时也是判断队列是否为空的条件。
顺序结构最重要的地方在于必须要空一个格子来区别队列是满了还是空的。rear记录的是下一个应该添加的位置,front记录的是当前第一个存元素的位置,rear实际上是没有存放元素的,判断队列是否满了的条件是下一个位置已经有元素了,所以rear的位置从此是无法存放数据的,这也是两种实现方法的区别之一。这么做主要是为了区别是空还是满,如果不这样做,满的时候和空的时候的状态是一样的。空出一个元素是最合适的办法,也可以用数组记录或者单独增加记录变量。

二、定义

采用顺序结构,只需要定义一个结构体,里面包含存放的数据、记录头和尾的变量即可。

struct Queue{int *data;int front;int rear;
};
struct Queue q;

三、代码实现

顺序实现,最重要的就是下标关系的判断,首先因为顺序实现是有限空间的,所以整个数组实际上是重复利用的,到了数组的尾部,再次循环回数组的头部,这样才不会越用越少。对应的,在增删元素时也要考虑到这一点,循环回头部用到的是取模运算,当前位置+1后对最大长度取模,如果超出了最大长度就会循环回数组头。

bool insert(int num)
{if(isFull())return false;q.data[q.rear]=num;q.rear=(q.rear+1)%initsize;return true;
}
int pop()
{if(isEmpty())return -1;int temp=q.data[q.front];q.front=(q.front+1)%initsize;return temp;
}

除此之外,关于队列是空还是满的判断也是一个点,由于队列是循环使用的,所以在判断是也要做出对应的修改。

bool isEmpty()
{if(q.front==q.rear)return true;elsereturn false;
}
bool isFull()
{if((q.rear+1)%initsize==q.front)return true;elsereturn false;
}

全部的代码如下

#include<bits/stdc++.h>
using namespace std;
int initsize=10;
struct Queue{int *data;int front;int rear;
};
struct Queue q;
void init()
{q.data=(int *)malloc(sizeof(int)*initsize);q.front=0;q.rear=0;
}
bool isEmpty()
{if(q.front==q.rear)return true;elsereturn false;
}
bool isFull()
{if((q.rear+1)%initsize==q.front)return true;elsereturn false;
}
bool insert(int num)
{if(isFull())return false;q.data[q.rear]=num;q.rear=(q.rear+1)%initsize;return true;
}
void insertmode()
{int num;if(isFull())printf("The queue is full!\n");else{printf("Input the number you want to insert:");scanf("%d",&num);insert(num);}
}
int pop()
{if(isEmpty())return -1;int temp=q.data[q.front];q.front=(q.front+1)%initsize;return temp;
}
void popmode()
{int num=pop();if(num==-1)printf("The queue is empty!\n");elseprintf("%d has been deleted from the queue!\n",num);}
int getFirst()
{if(isEmpty())return -1;elsereturn q.data[q.front];
}
void print()
{while(!isEmpty()){printf("%d ",getFirst());pop();}printf("\n");
}
int main()
{init();int n,choice=-1;scanf("%d",&n);for(int i=0;i<n;i++){int num;scanf("%d",&num);insert(num);}while(choice!=0){printf("1-Pop\n");printf("2-Insert\n");printf("3-getFront\n");printf("4-Show\n");printf("0-Exit\n");printf("Choice the function you want:");scanf("%d",&choice);switch(choice){case 1:popmode();break;case 2:insertmode();break;case 3:printf("The first number in the queue is %d\n",getFirst());break;case 4:print();break;case 0:break;default:printf("input error!\n");break;}     }return 0;}

四、优缺点分析

采用顺序结构,必然会出现顺序的通病:内存问题,总的来说队列上采用顺序结构不是很合适,在判断满还是空、下标移动上都很麻烦,实际使用时不会用的,但却很常在考题中出现。

数据结构 3-2-2 队列的顺序存储实现相关推荐

  1. 【数据结构笔记06】队列及其顺序存储、链式存储

    本次笔记内容: 2.3.1 队列及顺序存储实现 2.3.2 队列的链式存储实现 文章目录 什么是队列 队列的顺序存储实现 循环队列 队列的链式存储实现 什么是队列 队列(Queue):具有一定操作约束 ...

  2. 数据结构(16)队列的顺序存储结构

    目录 1.队列的顺序存储 2.循环队列 3.循环队列的操作 3.1.初始化 3.2.判队空 3.3.入队 3.4.出队 1.队列的顺序存储 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并 ...

  3. c语言编程队列题,数据结构C语言编程 队列.doc

    数据结构C语言编程 队列 #include #include #define MAXQSIZE 10 typedef struct { int *base; //存储空间的起始地址,即数组的首地址,即 ...

  4. 数据结构:栈和队列(Stack Queue)【详解】

    友情链接:数据结构专栏 目录 栈和队列 [知识框架] 栈 一.栈的基本概念 1.栈的定义 2.栈的常见基本操作 二.栈的顺序存储结构 1.栈的顺序存储 2.顺序栈的基本算法 (1)初始化 (2)判栈空 ...

  5. 【数据结构】栈和队列详细分析(全)

    目录 1.前言 2.栈的定义与特点 2.1顺序栈的定义 2.2顺序栈的操作 2.3链栈的定义 2.4链栈的操作 3.队列的定义与特点 3.1循环队列 3.2循环队列的操作 3.3链队的定义 3.4链队 ...

  6. Java数据结构与算法:队列

    1. 队列的介绍 队列 (Queue)是另一种限定性的线性表,它只允许在表的一端插入元素,而在另一端删除元素,所以队列具有先进先出(Fist In Fist Out, 缩写为FIFO)的特性.在队列中 ...

  7. 数据结构(二)--队列

    数据结构(二)–队列 文章目录 数据结构(二)--队列 介绍 代码实现 数组方式实现 普通队列 环形队列 链式实现 单向队列 介绍 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front) ...

  8. 算法与数据结构(part5)--栈与队列

    学习笔记,仅供参考,有错必纠 文章目录 算法与数据结构–基于python 栈 栈是什么 栈(ADT)的操作 栈的实现 队列 队列是什么 队列的操作 队列的实现 双端队列 双端队列是什么 双端队列的操作 ...

  9. 顺序循环队列类c#语言,C#--循环队列的顺序存储

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  10. 队列的顺序存储框架搭建

    队列的顺序存储 #define MAX_SIZE 1024 顺序队列结构体 typedef struct SEQUEUE{void* data[MAX_SIZE];int size }Sequeue; ...

最新文章

  1. Android 中 include的使用
  2. 动态规划(DP),Human Gene Functions
  3. 分布式查询的使用准则
  4. git push github SSL报错处理
  5. VTK:突出坏细胞用法实战
  6. python3 for循环怎么用_Python3入门系列之-----循环语句(for/while)
  7. 基于Spring Security的认证授权_应用详解_自定义退出_Spring Security OAuth2.0认证授权---springcloud工作笔记130
  8. 复制oracle9i数据库,Oracle 10g 中Duplicate 复制数据库
  9. 泰安市建筑物矢量数据(Shp格式+带高度)
  10. c语言程序实验报告范文,C语言实验报告范文
  11. H5网站接入Paypal支付接口
  12. 还在使用Window原始的CMD界面?教你一招进行界面完美优化
  13. 5e检索服务器信息,5Eplay易玩网服务器出租常见问题解答(FAQ)
  14. Java ArrayList集合案例(上课笔记)
  15. 纪念三毛辞世20周年——《三毛经典语录》
  16. 他曾被视为马斯克第二,现在是等着坐牢的骗子
  17. 苹果手机验真假_别再被坑了,这3大技巧可辨别真假iPhone,懂得话赚大了
  18. 使用xlnt库读取excel中文乱码
  19. 三阶魔方六面拼齐教程
  20. LeetCode NO7. 整数反转

热门文章

  1. HTML img 标签的 border 属性
  2. FineReport(二)帆软报表图表的
  3. jsp页面从session获取当前用户信息控制页面按钮是否显示
  4. cloud源码-Ribbon
  5. 总结下SQLServer和Oracle转换的脚本
  6. Powerdesigner导出ORACLE形式sql文件遇到的问题总结
  7. httpClient测试
  8. 差距只是客观存在的事实,与服不服无关。
  9. JQuery判断元素是否存在
  10. SharePoint 2013 Reporting Service 部署配置图文教程