用c语言完成数据结构循环顺序队列完成入站、出队、获取队列长度
时间: 2023-12-11 09:02:17 浏览: 89
循环顺序队列是一种特殊的队列,它在数组的基础上实现了队列的功能。以下是使用C语言完成该数据结构的代码。
首先,我们需要定义循环顺序队列的结构体:
```c
#define MAXSIZE 100 // 循环顺序队列的最大容量
typedef struct {
int data[MAXSIZE]; // 存放队列元素的数组
int front; // 队头指针
int rear; // 队尾指针
} SqQueue;
```
其中,`front`指向队头元素的前一个位置,`rear`指向队尾元素的位置。
接下来,我们需要实现循环顺序队列的入队操作:
```c
bool EnQueue(SqQueue *Q, int x) {
if ((Q->rear + 1) % MAXSIZE == Q->front) { // 队列已满
return false;
}
Q->rear = (Q->rear + 1) % MAXSIZE;
Q->data[Q->rear] = x;
return true;
}
```
如果队列已满,即`(rear+1)%MAXSIZE == front`,则返回false;否则,将`x`插入队尾,并更新`rear`指针。
接着,我们需要实现循环顺序队列的出队操作:
```c
bool DeQueue(SqQueue *Q, int *x) {
if (Q->front == Q->rear) { // 队列为空
return false;
}
Q->front = (Q->front + 1) % MAXSIZE;
*x = Q->data[Q->front];
return true;
}
```
如果队列为空,即`front == rear`,则返回false;否则,将队头元素出队,并更新`front`指针。
最后,我们需要实现循环顺序队列的获取队列长度操作:
```c
int QueueLength(SqQueue Q) {
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
```
由于`rear`指向队尾元素,`front`指向队头元素的前一个位置,因此队列长度为`(rear-front+MAXSIZE)%MAXSIZE`。
完整代码如下:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int front; // 队头指针
int rear; // 队尾指针
} SqQueue;
bool EnQueue(SqQueue *Q, int x) {
if ((Q->rear + 1) % MAXSIZE == Q->front) {
return false;
}
Q->rear = (Q->rear + 1) % MAXSIZE;
Q->data[Q->rear] = x;
return true;
}
bool DeQueue(SqQueue *Q, int *x) {
if (Q->front == Q->rear) {
return false;
}
Q->front = (Q->front + 1) % MAXSIZE;
*x = Q->data[Q->front];
return true;
}
int QueueLength(SqQueue Q) {
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
int main() {
SqQueue Q;
Q.front = Q.rear = 0;
int length, x;
// 测试入队
EnQueue(&Q, 1);
EnQueue(&Q, 2);
EnQueue(&Q, 3);
EnQueue(&Q, 4);
EnQueue(&Q, 5);
// 测试获取队列长度
length = QueueLength(Q);
printf("队列长度为:%d\n", length);
// 测试出队
while (DeQueue(&Q, &x)) {
printf("%d ", x);
}
return 0;
}
```
阅读全文