Files
dsa/week3/stack.c

109 lines
1.7 KiB
C

/*
* Author: Walter
* Student ID: 1930006025
* Week_3
* Stack
*/
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <assert.h>
#include "stack.h"
bool CreateStack(Stack *stack, int size) {
/* check */
assert(size > 0);
/* memory allocate */
stack->data = (double *)malloc(sizeof(double) * size);
if (stack->data == NULL) {
return false;
}
/* init attribute */
stack->top = -1;
stack->size = size;
return true;
}
bool IsEmpty(Stack *stack) {
/* if empty, stack->top = -1 */
return stack->top < 0;
}
bool IsFull(Stack *stack) {
/* if full, stack->top = stack->size */
return stack->top >= stack->size;
}
bool Top(Stack *stack, double *x) {
/* check empty */
if (IsEmpty(stack)) {
return false;
}
/* get top */
*x = stack->data[stack->top];
return true;
}
bool Push(Stack *stack, double x) {
/* check */
if (IsFull(stack)) {
return false;
}
/* push */
stack->data[++stack->top] = x;
return true;
}
bool Pop(Stack *stack, double *x) {
/* check */
if (IsEmpty(stack)) {
return false;
}
/* get x, and top - 1 */
*x = stack->data[stack->top--];
return true;
}
void DisplayStack(Stack *stack) {
double *top_p = stack->data + stack->top;
/* print the top pointer hint */
printf("top --> ");
/* loop for stack data */
for (; top_p >= stack->data; top_p--) {
/* print top --> hint */
if (top_p != stack->data + stack->top) {
printf(" ");
}
printf("| % .7f |\n", *top_p);
}
/* print top --> hint */
if (top_p != stack->data + stack->top) {
printf(" ");
}
printf("+--------------+\n");
}
void DestroyStack(Stack *stack) {
free(stack->data);
stack->data = NULL;
stack->size = 0;
stack->top = -1;
}