week 4 queue

This commit is contained in:
2021-03-23 09:48:23 +08:00
parent 942770dbc9
commit 01f2d61464
3 changed files with 177 additions and 0 deletions

22
week4/main.c Normal file
View File

@@ -0,0 +1,22 @@
#include "queue.h"
#include <stdbool.h>
#include <stdio.h>
int main(void) {
Queue queue;
double value;
CreateQueue(&queue, 5);
puts("Enqueue 5 items.");
for (int x = 0; x < 5; x++)
Enqueue(&queue, x);
puts("Now attempting to enqueue again...");
Enqueue(&queue, 5.0);
DisplayQueue(&queue);
Dequeue(&queue, &value);
printf("Retrieved element = %f\n", value);
DisplayQueue(&queue);
Enqueue(&queue, 7.0);
DisplayQueue(&queue);
DestroyQueue(&queue);
return 0;
}

118
week4/queue.c Normal file
View File

@@ -0,0 +1,118 @@
/*
* Authro: Walter
* Student ID: 1930006025
* Week4_queue
*/
#include <stdlib.h>
#include <stdio.h>
#include "queue.h"
#include <assert.h>
bool CreateQueue(Queue *queue, int size) {
/* do some check */
assert(size > 0 && "Error: szie should be positive");
/* allocate memory */
queue->values = (double *)malloc(sizeof(double)*size);
if (queue->values == NULL) {
return false;
}
/* init values */
queue->front = 0;
queue->rear = -1;
queue->counter = 0;
queue->maxSize = size;
return true;
}
bool IsEmpty(Queue *queue) {
return queue->counter == 0;
}
bool IsFull(Queue *queue) {
return queue->maxSize == queue->counter;
}
bool Enqueue(Queue *queue, double x) {
/* check full */
if (IsFull(queue)) {
fprintf(stderr, "Error: the queue is full.\n");
return false;
}
/* move rear, add counter */
queue->rear++;
queue->counter++;
if (queue->rear >= queue->maxSize) {
queue->rear = 0;
}
/* enqueue value */
queue->values[queue->rear] = x;
return true;
}
bool Dequeue(Queue *queue, double *x) {
/* check */
if (IsEmpty(queue)) {
return false;
}
/* dequeue value */
*x = queue->values[queue->front];
/* move front and decrease counter */
queue->front++;
queue->counter--;
if (queue->front >= queue->maxSize) {
queue->front = 0;
}
return true;
}
void DisplayQueue(Queue *queue) {
int pos = queue->front;
/* loop for counter */
for (int i=0; i<queue->counter; i++) {
/* print front hint */
if (i == 0) {
printf("front --> ");
} else {
printf(" ");
}
printf("%f", queue->values[pos]);
pos++;
/* set pos to zero if it gets to end */
if (pos >= queue->maxSize) {
pos = 0;
}
/* print end hint */
if (i == queue->counter - 1) {
printf(" <-- rear\n");
} else {
printf("\n");
}
}
}
void DestroyQueue(Queue *queue) {
free(queue->values);
/* reset values */
queue->counter = 0;
queue->maxSize = 0;
queue->front = 0;
queue->rear = -1;
}

37
week4/queue.h Normal file
View File

@@ -0,0 +1,37 @@
/*
* Authro: Walter
* Student ID: 1930006025
* Week4_queue
*/
#include <stdbool.h>
/* main queue structure */
typedef struct {
double *values;
int front; /* last one of queue */
int rear; /* the newest one in queue */
int counter;
int maxSize;
} Queue;
/* create an queue */
bool CreateQueue(Queue *queue, int size);
/* check whether the queue is empty*/
bool IsEmpty(Queue *queue);
/* check whether the queue is full */
bool IsFull(Queue *queue);
/* put value into queue */
bool Enqueue(Queue *queue, double x);
/* get value from queue */
bool Dequeue(Queue *queue, double *x);
/* display queue to stdout */
void DisplayQueue(Queue *queue);
/* destroy an queue */
void DestroyQueue(Queue *queue);