1. (a) data
   (b) stack
   (c) stack
   (d) stack
   (e) stack
   (f) data
   (g) heap
   (h) stack
   (i) data
   (j) stack

# NOTE: Should show work for the following!
2. (a) get(11, 2) = 0
   (b) set(1, 3) = 9
   (c) clear(23, 3) = 23
   (d) toggle(23, 3) = 31
   (e) get(set(45, 4) >> 3, 1) = 1

3a:

int sum = 0;
for(int i = 0; i < 10; ++i) sum += a[i];

3b:

char *s = (char *)malloc(sizeof(char) * 5);

3c:

if(c >= 'a' && c <= 'z') printf("uppercase\n");
else if(c >= '0' && c <= '9') printf("digit\n");
else printf("neither\n");

4a:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int *a = NULL, cap = 0, len = 0;
    int tmp;

    while(scanf("%d", &tmp) == 1) {
        if(len >= cap - 1) {
            cap = (cap == 0) ? 8 : cap * 2;
            a = (int *)realloc(a, cap * sizeof(int));
        }
        a[len++] = tmp;
    }

    return 0;
}

4b:

#include <stdio.h>

int main(int argc, char *argv[])
{   
    unsigned int x;

    scanf("%u", &x);

    int count = 0;
    for(unsigned int m = 1; m; m <<= 1) {
        if((m & x)) count += 1;
    }

    printf("%u\n", 1 << count);

    return 0;
}