数据结构 --- 循环队列(队列的顺序存储结构)

工程目录结构图:

common.h:

 1 //#ifndef __common_h__
 2 //#define __common_h__
 3
 4 #define OK 1
 5 #define ERROR 0
 6 #define TRUE 1
 7 #define FALSE 0
 8
 9 #define MAXSIZE 20
10
11 typedef int Status;        //函数的返回结果,OK、ERREO、TRUE、FALSE
12 typedef int ElemType;   //结点数据域的数据类型
13
14 //#endif

common.h:

1 #include "common.h"
2
3 Status visit(ElemType e)
4 {
5     printf("%d , ", e);
6     return OK;
7 }

Queue.h:

1 //循环队列的结构
2 typedef struct
3 {
4     ElemType data[MAXSIZE];
5     int front;                //头指针
6     int rear;                //尾指针,队列不为空,指向队列尾元素的下一位
7 }SqQueue;

Queue.c:

 1 #include <stdio.h>
 2 #include "common.h"
 3 #include "Queue.h"
 4
 5 Status InitQueue(SqQueue *Q)
 6 {
 7     Q->front = 0;
 8     Q->rear = 0;
 9     return OK;
10 }
11
12 Status ClearQueue(SqQueue *Q)
13 {
14     Q->front = Q->rear = 0;
15     return OK;
16 }
17
18 Status QueueEmpty(SqQueue Q)
19 {
20     if (Q.front == Q.rear)
21         return OK;
22     else
23         return FALSE;
24 }
25
26 int GetQueueLength(SqQueue Q)
27 {
28     return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
29 }
30
31 Status EnQueue(SqQueue *Q, ElemType e)
32 {
33     //队列已满
34     if ((Q->rear + 1) % MAXSIZE == Q->front)
35         return FALSE;
36
37     Q->data[Q->rear] = e;
38     Q->rear = (Q->rear + 1) % MAXSIZE; //队尾向后以一个元素,队满后则转移到队列头部
39     return OK;
40 }
41
42 Status DeQueue(SqQueue *Q, ElemType *e)
43 {
44     if (Q->front == Q->rear)   //队列为空
45         return FALSE;
46
47     *e = Q->data[Q->front];
48     Q->front = (Q->front + 1) % MAXSIZE;
49
50     return OK;
51 }
52
53 Status GetQueueHead(SqQueue *Q, ElemType *e)
54 {
55     if (Q->front == Q->rear) //队列为空
56         return FALSE;
57     *e = Q->data[Q->front];
58     return OK;
59 }
60
61 Status QueueTraverse(SqQueue Q)
62 {
63     int index = Q.front;
64     while ((index + Q.front) != Q.rear)  //遍历完成
65     {
66         visit(Q.data[index]);
67         index = (index + 1) % MAXSIZE;
68     }
69
70     return OK;
71 }
72
73 void StartQueue()
74 {
75     SqQueue Q;
76     if (OK == InitQueue(&Q))
77         printf("\n循环队列初始化成功!\n");
78
79     for (int i = 1; i <= 10; ++i)
80         EnQueue(&Q, i * 2);
81
82     printf("\n\n插入数据1-10后的队列长度为: %d\n", GetQueueLength(Q));
83
84     printf("\n\n队列中的元素是:\n");
85     QueueTraverse(Q);
86
87     int e;
88     DeQueue(&Q, &e);
89     printf("\n\n队首出列: %d\n", e);
90     printf("\n\n队首出列后的队列长度为: %d\n", GetQueueLength(Q));
91
92     GetQueueHead(&Q, &e);
93     printf("\n\n队首元素为: %d\n", e);
94
95     ClearQueue(&Q);
96     printf("\n\n清空后的队列长度: %d\n", GetQueueLength(Q));
97 }

main.c:

1 int main()
2 {
3     //LinkListStart();
4     //StackStart();
5     //LinkStackStart();
6     StartQueue();
7     getchar();
8     return 0;
9 }

原文地址:https://www.cnblogs.com/luguoshuai/p/9256360.html

时间: 2024-10-09 02:32:08

数据结构 --- 循环队列(队列的顺序存储结构)的相关文章

数据结构之线性表(顺序存储结构)

小学生放学都是要按顺序排队的,一个接一个,每个小学生的前后位置是固定的,这样便于迅速清点. 其实这就是一个线性表,从这件事里我们就可以找到很多关于线性表的特性,如 1.线性表是一个序列,它是有顺序的(排队) 2.第一个元素无前驱,最后一个无后继,其他每个元素都有一个前驱和后继(一个接一个) 3.元素是有限的(小学生的个数是有限的) 4.数据类型都相同(都是小学生在排队) 说明白线性表示什么,下面我们直接看线性表的实现 线性表的实现分顺序存储结构和链式存储结构 顺序存储结构: #define LI

数据结构(三)——基于顺序存储结构的线性表

数据结构(三)--基于顺序存储结构的线性表 一.基于顺序存储结构的线性表实现 1.顺序存储的定义 线性表的顺序存储结构是用一段地址连续的存储单元依次存储线性表中的数据元素. 2.顺序存储结构的操作 使用一维数组实现顺序存储结构. template <typename T> class SeqList:public List<T> { protected: T* m_array;//顺序存储空间 int m_length;//当前线性表的长度 }; 一维顺序存储结构可以是原生数组或是

数据结构-循环顺序队列的基本操作

//循环顺序队列的基本操作 #include <iostream> #include <string.h> using namespace std; #define MAXLEN 8 #define datatype char #define Status int typedef struct{ datatype s[MAXLEN]; int front; //记录队首的指针 int rear; //记录队尾的指针 }SeqQueue; //初始化 Status InitSeqQu

数据结构与算法——线性表顺序存储结构

今天总结一下数据结构中的线性表中的顺序存储结构,这是一种比较简单的结构. 首先,看一下什么是线性表. 什么是线性表? 线性表是一种简单的数据结构,数据元素之间是一对一的关系,即除了第一个和最后一个元素外其余元素都是首尾相接的.元素的个数称为线性表的长度,长度为零则表示线性表为空. 什么是线性表的循序存储结构? 线性表中的顺序存储结构就是把线性表中的元素按逻辑次序依次存放在一组地址连续的存储空间中,也把这种线性表称为顺序表.根据顺序表的特点,通常是用数组来存储元素的. 下面就看具体的实现(C++)

数据结构之线性表之顺序存储结构(3)

1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数据元素的有限序列. 如果用数学语言来进行定义: (声明:由于下标不是很好弄出来,所以只能表示下面这种方式了,请见谅!) 若线性表记作(a1,...ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i

数据结构:线性链表的顺序存储结构

首先先了解什么是线性表的顺序储存结构,线性表的顺序存储结构就是用一段连续的存储空间单元一次存储线性表的数据元素. 这里我们可以用C/C++语言来表示顺序存储结构. 于是我们来定义一个顺序存储的代码如下: typedef int ElemType; const int MAXSIZE = 100; struct array { ElemType data[MAXSIZE]; int length; }; 从这里我们来讲解,顺序结构的三个属性: 存储空间的起始位置:数组data,它的存储位置就是存储

数据结构与算法-线性表顺序存储结构删除操作的实现

这一章节我们来看一下线性表顺序存储结构删除操作的简单实现 package com.ray.testobject; public class Test { private Object[] list; public Object[] getList() { return list; } /** * 初始化list * * @param num * 元素个数 */ private void iniList(int num) { list = new Object[num]; for (int i =

数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析

#include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量#define LISTINCREMENT 10//线性表存储空间的分配增量//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef

数据结构-循环顺序队列&amp;链队列

队列接口实现: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _003_队列 { interface IQueue<T> { int Count { get; } int GetLength(); bool IsEmpty(); void Clear(); void Enqueue(T it

数据结构之线性表的顺序存储结构的实现--C语言版

#include <stdio.h> #include <stdlib.h> #include <time.h> #define INIT_SIZE 100 #define PER_INCREMENT 10 typedef struct SqList{ char *Element; int Length; int ListSize; }SqList; void InitSqList(SqList *L) { L->Element=(char*)malloc(siz