Evaluating Dotty Strings
CJam, 27 24 23 22 bytes
q{i]_,+~3&lt;-&quot;1+2* &quot;=~}/

Pretty straight forward. I use CJam's stack as the stack mentioned in the question ;)
Algorithm
First lets look at the ASCII code for . and :.
'.i ':ied


[46 58]

Since in CJam, index wraps around, lets see if we can use these values directly to get the desired operation ..
'.i4% ':i4%ed


[2 2]

So I cannot simply use the ASCII codes in a 4 length operation string. Lets try some other values
'.i 10% ':i 10%ed


[6 8]

which on a 4 length string boils down to

[2 0]

I can use this mod 10 operation but that will cost be 2 bytes. Lets try something else
'.i5% ':i5%ed


[1 3]

Nice!, now we just subtract 1 for the stack size condition to get the indexes 0, 1, 2 and 3 and use a 5 length array (&quot;1+2* &quot;) as a switch case. The last space is just a filler to make it of length 5. This is just 1 extra byte as compared to modding operation.
q{                  }/    e# parse each input character in this loop
  i]                      e# convert '. or ': into ASCII code and wrap everything
                          e# in stack in an array
    _,+                   e# Copy the stack array, take its length and add the length to
                          e# the stack array 
       ~3&lt;                e# unwrap the stack array and check if stack size is less than 3
                          e# 3 because either . or : is also on stack
          -               e# subtract 0 or 1 based on above condition from ASCII code
           &quot;1+2* &quot;        e# string containing the operation to perform
                  =~      e# chose the correct operation and evaluate it

Try it online here
1 byte saved thanks to cosechy