diff --git a/week4/main.c b/week4/main.c new file mode 100644 index 0000000..97536aa --- /dev/null +++ b/week4/main.c @@ -0,0 +1,22 @@ +#include "queue.h" +#include +#include + +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; +} diff --git a/week4/queue.c b/week4/queue.c new file mode 100644 index 0000000..7b62294 --- /dev/null +++ b/week4/queue.c @@ -0,0 +1,118 @@ +/* + * Authro: Walter + * Student ID: 1930006025 + * Week4_queue + */ + +#include +#include +#include "queue.h" + +#include + +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; icounter; 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; +} diff --git a/week4/queue.h b/week4/queue.h new file mode 100644 index 0000000..f49f3b9 --- /dev/null +++ b/week4/queue.h @@ -0,0 +1,37 @@ +/* + * Authro: Walter + * Student ID: 1930006025 + * Week4_queue + */ + +#include + +/* 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);