Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.90 KB | None | 0 0
  1. #include <stddef.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5. #define STACK_MAX_SIZE 20
  6. typedef float T;
  7.  
  8. typedef struct Stack_tag {
  9.     T *data;
  10.     size_t size;
  11.     size_t top;
  12. } Stack_t;
  13.  
  14. Stack_t* createStack() {
  15.     Stack_t *out = NULL;
  16.     out = malloc(sizeof(Stack_t));
  17.     if (out == NULL) {
  18.         exit(-1);
  19.     }
  20.     out->size = 10;
  21.     out->data = malloc(out->size * sizeof(T));
  22.     if (out->data == NULL) {
  23.         free(out);
  24.         exit(-1);
  25.     }
  26.     out->top = 0;
  27.     return out;
  28. }
  29.  
  30. void deleteStack(Stack_t **stack) {
  31.     free((*stack)->data);
  32.     free(*stack);
  33.     *stack = NULL;
  34. }
  35.  
  36. void resize(Stack_t *stack, size_t new_size) {
  37.     if (stack->size == new_size) {
  38.         return;
  39.     } else if (stack->size < new_size) {
  40.         stack->size = new_size;
  41.         stack->data = realloc(stack->data, new_size * sizeof(T));
  42.         if (stack->data == NULL) {
  43.             exit(-1);
  44.         }
  45.     } else if (stack->top <= new_size) {
  46.         stack->size = stack->top;
  47.         stack->data = realloc(stack->data, stack->size * sizeof(T));
  48.     } else {
  49.         exit(-1);
  50.     }
  51. }
  52.  
  53. void implode(Stack_t *stack) {
  54.     resize(stack, stack->top);
  55. }
  56.  
  57. void push(Stack_t *stack, T value) {
  58.     if (stack->top >= stack->size) {
  59.         resize(stack, stack->size * 2);
  60.     }
  61.     stack->data[stack->top] = value;
  62.     ++stack->top;
  63. }
  64.  
  65. T pop(Stack_t *stack) {
  66.     if (stack->top == 0) {
  67.         exit(-1);
  68.     }
  69.     --stack->top;
  70.     return stack->data[stack->top];
  71. }
  72.  
  73. T front(const Stack_t *stack) {
  74.     if (stack->top <= 0) {
  75.         exit(-1);
  76.     }
  77.     return stack->data[stack->top - 1];
  78. }
  79.  
  80. int main() {
  81.     int i;
  82.     Stack_t *s = createStack();
  83.  
  84.     for (i = 0; i < 300; i++) {
  85.         push(s, i);
  86.     }
  87.     implode(s);
  88.     for (i = 0; i < 300; i++) {
  89.         printf("%f ", front(s));
  90.         printf("%f ", pop(s));
  91.     }
  92.  
  93.     deleteStack(&s);
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement