import Foundation
class Stack<T> {
private var elements = [T]()
func push(_ element: T) {
elements.append(element)
}
func pop() {
if elements.isEmpty {
} else {
elements.removeLast()
}
}
func top() -> T {
assert(!elements.isEmpty,"栈为空,返回-1")
return elements.last!
}
func empty() -> Bool {
return elements.isEmpty
}
func count() -> Int {
return elements.count
}
}
func isNumber(_ c:Character)->Bool
{
let nums="0123456789"
return nums.contains(c)
}
var precedence:[Character:Int]=["-": 1,"+": 1,"*": 2,"/": 2,"^": 3]
var operators = Stack<Character>()
var numbers = Stack<Double>()
func calc()
{
if (operators.empty()) {return}
if (numbers.empty() || numbers.count() < 2){return}
let b = numbers.top()
numbers.pop()
let a = numbers.top()
numbers.pop()
let p = operators.top()
operators.pop()
var ans = 0.0
if (p == "+") {ans = a + b}
else if (p == "-") {ans = a - b}
else if (p == "*") {ans = a * b}
else if (p == "/") {ans = a / b}
else if (p == "^") {ans = pow(a, b)}
numbers.push(ans);
}
func calculate(s:String)->Double
{
numbers.push(0)
var i=0
let n=s.count
while (i<n)
{
let c=s[s.index(s.startIndex,offsetBy: i)]
if(c==" "){
i+=1
continue}
else if(c=="("){
operators.push(c)
}else if(c==")"){
while (!operators.empty())
{
if (operators.top() != "(")
{calc();}
else
{
operators.pop()
break
}
}
}else{
if(isNumber(c))
{
var t=0.0,j=i
while (j < s.count && isNumber(s[s.index(s.startIndex,offsetBy: j)]))
{
let r1=s[s.index(s.startIndex,offsetBy: j)]
t = t * 10 + Double(String(r1))!
j+=1
}
numbers.push(t)
i=j-1
}
else{
if(i>0&&s[s.index(s.startIndex,offsetBy: i-1)]=="(")
{
numbers.push(0)
}
while(!operators.empty() && operators.top() != "(")
{
let prev=operators.top()
if(precedence[prev]! >= precedence[c]!)
{
calc()
}
else {break}
}
operators.push(c)
}
}
i+=1
}
while(!operators.empty())
{
calc()
}
return numbers.top()
}
if let s1=readLine(){
print(calculate(s:s1));
}