Search code examples
c++stackrpn

C++ stack for multiple data types (RPN vector calculator)


I have designed a quick and basic vector arithmetic library in C++. I call the program from the command line when I need a rapid cross product, or angle between vectors. I don't use Matlab or Octave or related, because the startup time is larger than the computation time. Again, this is for very basic operations.

I am extending this program, and I will make it work as an RPN calculator, for operations of the type:

1 2 3
4 5 6
x
out: -3 6 -3

(give one vector, another vector, and the "cross" operator; spit out the cross product)

The stack must accept 3d vectors or scalars, for operations like:

1 2 3
2
*
out: 2 4 6

The lexer and parser for this mini-calculator are trivial, but I cannot seem to think of a good way for creating the internal stack. How would you create a stack of for containing vectors or doubles (I rolled up my own very simple vector class - less than one hundred lines and it does everything I need).

How can I create a simple stack which accepts elements of class Vector or type double?

Thank you.


Solution

  • The simplest way would be just to create an Operand struct that contains a double for the scalar and a Vector object for the vector:

    struct Operand
    {
        double scalar_;
        Vector vector_;
        bool isVector_;
    };
    

    (you can set isVector_ to true if it is a vector operand, and false if it is a scalar operand)

    For the actual stack, you can just use std::stack<Operand>.

    Other options include inheritance (creating scalar and vector types derived from an operand base type) or something like boost::variant, but for something simple like this, a composition struct like the Operand shown above is probably the easiest way to do it.