ANSWERS TO STACKS AND QUEUES EXERCISES



 1.        S   Y       E U Q     T S A     O   N I E
 
     E A S A Y A Q U E U Q A S T S A E I O I N I E
       E A E A E A Q U Q A E A S A E   E I E I E
         E   E   E A Q A E   E A E       E   E
                   E A E       E
                     E

 2.  L  S  T  F  T
    
     Here's what the stack will look like at each step: 
 
                                 T       U   T
                           R   S S S   O O O O O
                         I I I T T T T T T T T T T
               I   N   F F F F F F F F F F F F F F F
             T T T T T T T T T T T T T T T T T T T T T
       A   S S S S S S S S S S S S S S S S S S S S S S S
     L L L L L L L L L L L L L L L L L L L L L L L L L L L
     -----------------------------------------------------
     L A * S T I * N * F I R * S T * * O U * T * * * * * *

     Note that at the end, only L is on the stack, but the question asks
     for the contents of the array elements s[0] to s[4]. The C implementation
     of a stack using an array does not explicitly "erase" an element when
     it is popped from the stack; instead, it simply decrements the variable
     that counts the number of elements on the stack. That's why at the end,
     array elements s[1] to s[4] still contain S, T, F, T.


 3. 
      #include <stdio.h>
      #include <stdlib.h>
      void STACKpush(int item) {
         if (N == maxN) {
            printf("Error:  stack overflow.\n");
            exit(EXIT_FAILURE);
         }
         s[N++] = item; 
      }

      int STACKpop(void) {
         if (N == 0) {
            printf("Error:  stack underflow.\n");
            exit(EXIT_FAILURE);
         }
         return s[--N];
      }

      The exit() function terminates the program. EXIT_FAILURE is a predefined
      constant that is used to signal an abnormal termination.


 4.        E   A       S Y Q     U E S     T   I O N
 
     E E E A A S S S S Y Q U U U E S T T T   I O N
       A A S S Y Y Y Y Q U E E E S T   I I   O N 
         S   Y   Q Q Q U E   S S T       O   N
                   U U E       T             
                     E 

 5.   S  T  O  U  T




 6. The second ( 4 6 8 7 5 3 2 9 0 1 ).  When the 4 is popped, the
    stack must have 3 2 1 0 on it, so 1 has to be popped before 0.

 7.   #include <stdio.h>
      #include "STACK.h"
      
      int main(void) {
         int c;
         while ((c = getchar()) != EOF)      /* read character and   */
            STACKpush(c);                    /* push onto stack      */

         while (!STACKisempty())             /* repeatedly pop from  */
            putchar(STACKpop());             /* stack until empty    */ 
         printf("\n");
         return 0;
      }

      Note the C idiom for reading an arbitrary sequence of characters.


 8.   See /u/cs126/files/exercises/adt/paretheses2.c.


 9.   #include <stdio.h>
      #include "STACK.h"

      int main(void) {
         int n;
         scanf("%d", &n);
         STACKinit();
         while (n > 0) {           /* push 1 if n is odd,   */
            STACKpush(n % 2);      /* push 0 if n is even   */
            n /= 2;
         }

         while (!STACKisempty())
            printf("%d", STACKpop());
         printf("\n");
         return 0;
      }

10.  void STACKmultipop(int k) {
        int i;
        for (i = 0; i < k; i++)
           if (!STACKisempty())
              STACKpop();
     }

11.  We'll maintain two stacks A and B.

        void QUEUEput(int x): push element x onto stack A

        int QUEUEget(void):
           if stack B is empty
   (*)        pop all elements from A and push onto B
           pop element from B and return

        int QUEUEisempty(void):
           return true if both stack A and B are empty

     The crucial reason this works is (*). Popping the elements from
     A and pushing onto B has the effect of reversing all of the 
     elements. This is just what we want since now the topmost element
     on B contains the one least recently added.