week 4 queue
This commit is contained in:
22
week4/main.c
Normal file
22
week4/main.c
Normal 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
118
week4/queue.c
Normal 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
37
week4/queue.h
Normal 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);
|
||||
Reference in New Issue
Block a user