/********************************************************************
Engineering 3891 Advanced Structured Programming
Assignment: 5 Date Due: October 20th/2000
Name: Daryl Martin
Student #: 9713520
Username: darylm
*********************************************************************/
#include "assign5.h"
int size = 0;
myComplex stack[STACKSIZE];
/******************************************************************
* push -- Put's one number on the stack. Returns true if sucessful
* and false if not
*
* Parameters:
* myComplex x - The value to be pushed onto the stack
*
* Modifies: none
*
* Returns: True or false Date: 10/20/00
*******************************************************************/
bool push(myComplex x)
{
if(size >= STACKSIZE)
   return false;
   stack[size++] = x;
   return true;
}
/******************************************************************
* pop -- Pop a number from the stack and pass it back to the
* referenced variable. True if sucessful, false if not
*
*
* Modifies: none
*
* Returns: True or false Date: 10/20/00
*******************************************************************/
bool pop(myComplex& x)
{
   if(size == 0)
   {
      return false;
   }
   if(size != 0)
   {
      x = stack[--size];
      return true;
   }
}
/******************************************************************
* oper -- Carries out the operation. ie. Multiplication, Divison
*
* Parameters:
* char op - The operation that the want's done
*
* Modifies: none
*
* Returns: True or false Date: 10/20/00
*******************************************************************/
bool oper(char op)
{
   myComplex leftSide, rightSide;
    myComplex final;
   if (size < 2 )
      return false;
      pop(rightSide);
      pop(leftSide);
    switch (op)    {
   case '+':
      final.re = (leftSide.re + rightSide.re);
      final.im = (leftSide.im + rightSide.im);
      break;
case '-':
      final.re = (leftSide.re - rightSide.re);
      final.im = (leftSide.im - rightSide.im);
      break;
case '*':
      final.re = (leftSide.re * rightSide.re) - (leftSide.im * rightSide.im);
      final.im = (leftSide.re * rightSide.im) + (leftSide.im * rightSide.re);
      break;
case '/':
   if ((rightSide.re == 0) && (rightSide.im == 0))
   {
         push(leftSide);
         push(rightSide);
         return false;
   }
      final.re = ((leftSide.re * rightSide.re + leftSide.im * rightSide.im)/(rightSide.re
* rightSide.re + rightSide.im * rightSide.im));
      final.im = ((rightSide.re * leftSide.im - rightSide.im * leftSide.re)/(rightSide.re
* rightSide.re + rightSide.im * rightSide.im));
      break;
   default:
      push(leftSide);
      push(rightSide);
      return false;
      break;
   }
      push(final);
      return true;
    }