C语言实现循环队列(基本操作及图示)

————————————————————————————————————————————

如果使用顺序表作为队列的话,当处于右图状态则不能继续插入新的队尾元素,否则会因为数组越界而导致程序代码被破坏。

由此产生了由链表实现的循环队列,只有队列未满时才可以插入新的队尾元素。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

基本操作:

/* 定义链表队列 */

定义结构体中front指示队头位置,rear指示队尾位置,base指针用于申请空间并存放数据。

/* 初始化队列 */

使用指针*base申请100个内存空间,front和rear分别为0,此时队列为空

/* 判断空或满 */

  • 初始化时,front = rear = 0 时为空,Q->rear = (0+1)%100 = 1,队列未满可以插入队列

  • 入队3个元素时,rear = 3,Q->rear = (3+1)%100 = 4,队列未满

  • 入队99个元素时,rear = 99,Q->rear = (99+1)%100 = 0,队列满,不可入队

  • 出队2个元素时,front = 2

    出队后,执行两次 Q->front = (Q->front + 1) % MAXQSIZE,得到Q->front = 2

  • 再次入队1个元素时,rear = 0,Q->rear = (99+1)%100=0,队列未满,可以入队

实现代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define OK 1
 4 #define ERROR 0
 5 #define OVERFLOW -2
 6 #define MAXQSIZE 100
 7 typedef int Status;
 8 typedef int QElemType;
 9 typedef struct Node
10 {
11     QElemType *base; //初始化动态分配存储空间
12     int front;
13     int rear;
14 } SqQueue;
15 Status InitQueue(SqQueue *Q)
16 {
17     Q->base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
18     if (!Q->base)
19         exit(OVERFLOW);
20     Q->front = Q->rear = 0;
21     return OK;
22 }
23 Status EnQueue(SqQueue *Q, QElemType elem)
24 {
25     //队列为空时 1%100==1,队列满时(99+1)%100==0,最多容纳99个元素
26     if ((Q->rear + 1) % MAXQSIZE == (Q->front))
27         return ERROR;
28     Q->base[Q->rear] = elem;
29     Q->rear = (Q->rear + 1) % MAXQSIZE; //rear始终在0-100中循环
30     return OK;
31 }
32 Status OutQueue(SqQueue *Q, QElemType *e)
33 {
34     if (Q->front == Q->rear)
35         return ERROR;
36     *e = Q->base[Q->front];
37     Q->front = (Q->front + 1) % MAXQSIZE;
38     return OK;
39 }
40 Status PrintQueue(SqQueue Q)
41 {
42     printf("the queue is:");
43     for (int i = Q.front; i < Q.rear; ++i)
44         printf("%d ", Q.base[i]);
45     return OK;
46 }
47 int main()
48 {
49     SqQueue queue;
50     QElemType elem;
51     int i;
52     InitQueue(&queue);
53     printf("input:");
54     while(scanf("%d", &elem) != EOF)
55         EnQueue(&queue, elem);
56     PrintQueue(queue);
57     /* 输入要出队列的个数 */
58     printf("\noutput:");
59     scanf("%d", &i);
60     while(i != 0)
61     {
62         OutQueue(&queue, &elem);
63         i--;
64     }
65     PrintQueue(queue);
66     return OK;
67 }
时间: 2024-10-08 11:01:01

C语言实现循环队列(基本操作及图示)的相关文章

循环队列基本操作

/* * 循环队列基本操作. * 少用一个元素空间,约定以"队列头指针在队列尾指针的下一个位置"作为队列满的标志. * "队列头指针等于队列尾指针"作为队列空的标志. */ #include <stdio.h> #include <stdbool.h> #include <malloc.h> #define MAXQSIZE 100 typedef char ElemType; typedef struct { ElemType

数据结构之---C语言实现循环队列

//循环队列 //杨鑫 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 typedef int QElemType; typedef struct queue { QElemType elem[MAXSIZE]; int front; int rear; }SqQueue; //定义队头 int init_Queue(SqQueue **q) //初始化 { (*q)->front = 0; (*q)->

数据结构基础(5)--C语言实现循环队列--静态

#include<stdio.h> #include<malloc.h> #include<stdbool.h> typedef struct Queue{ int * PBase;//指向数组第一个元素的指针 int front;//队列头部元素下标 int rear;//队列尾部元素下标 }QUEUE; /** *初始化队列,实现队列的数组长度为6. **/ void initQueue(QUEUE * pQ) { pQ->PBase=malloc(sizeo

【数据结构-队列】循环队列

关于循环队列 循环队列就是像一个圈一样,可以一直不停的入队和出队,例如:队列已经满了,如果执行一次出队操作,队列头部就空出来了,这时候就可以把元素继续插入空出来的那里,头指针向后移第二个元素就变成的队列的头,上一个对头就变成了队尾 下图中:此时队列已经满了,但是当把12出队后,head指针会指向第1个位置,这是再忘队列中插入元素的,tail就会指向0的位置,然后把元素插入到0的位置. 组成循环队列需要的元素 int data[COUNT];//存放元素 int head;//头指针 int ta

数据结构算法C语言实现(十二)--- 3.4循环队列&amp;队列的顺序表示和实现

一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 64 9 #include <cstdio

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

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

顺序循环队列的c语言实现

1. 循环队列的顺序存储结构 typedef struct { QElemType data[MAXSIZE]; int front; /* 头指针 */ int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */ }SqQueue; 2. 初始化一个空队列Q Status InitQueue(SqQueue *Q) { Q->front=0; Q->rear=0; return OK; } 3.将Q清为空队列 Status ClearQueue(SqQueue *Q) {

C语言 链队列基本操作

C语言链队列基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h> /* C语言链队列基本操作 2014年7月11日10:11:41 */ typedef int qType; typedef struct node { qType data; struct node *pNext; }Node,*pNode; typedef struct queue { pNode front; pNode re

循环队列的初始化、入队、出队等基本操作

循环队列的初始化.入队.出队等基本操作,实现代码如下: #include<iostream> using namespace std; #define TRUE 1 #define FALSE 0 //循环队列的类型定义 #define MAXSIZE 50//队列的最大长度 typedef struct { int element[MAXSIZE];//队列的元素空间 int front;//头指针指示器 int rear;//尾指针指示器 }SeqQueue; //循环队列初始化 void