编辑代码

import Foundation
class Stack<T> {  
    private var elements = [T]()  
      
    // 压栈操作  
    func push(_ element: T) {  
        elements.append(element)  
    }  
      
    // 弹栈操作  
    // 如果栈为空,返回 nil  
    func pop()  {  
        if elements.isEmpty {  
            
        } else {  
             elements.removeLast()  
        }  
    }  
      
    // 查看栈顶元素(不弹出)  
    // 如果栈为空,返回 nil  
    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} 
        //if (operators.empty()) {return}
        let b = numbers.top()
        numbers.pop()
        let a = numbers.top()
        numbers.pop()
        let p = operators.top()
        operators.pop()
        var ans = 0.0//定义为Double
        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))!//character.asciiValue! - '0'.asciiValue!两种方法把字符变为数字
                    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));
}
// print(calculate(s:"1+(-3)/(2/1)+5^2"))
// print(isNumber("9"))