中綴表達(dá)式轉(zhuǎn)前綴表達(dá)式

計(jì)算機(jī)算法實(shí)現(xiàn)步驟

  1. 構(gòu)造兩個(gè)棧,s1,s2分別存儲運(yùn)算符與操作數(shù)
  2. 從右至左掃描中綴表達(dá)式
    2.1 如果當(dāng)前值為數(shù)值,讀取,直到遇到運(yùn)算符,將其轉(zhuǎn)為一個(gè)數(shù)值并存入s2
    2.2 如果是運(yùn)算符,則比較優(yōu)先級
    2.2.1 如果當(dāng)前運(yùn)算符的優(yōu)先級大于等于s1棧頂運(yùn)算符的優(yōu)先級,則將運(yùn)算符直接入棧;
    2.2.2 否則將棧頂運(yùn)算符出棧并輸出,直到當(dāng)前運(yùn)算符的優(yōu)先級大于等于棧頂運(yùn)算符的優(yōu)先級(如果棧頂是括號直接入棧),再將當(dāng)前運(yùn)算符入棧。
    2.3 如果是括號,則根據(jù)括號的方向進(jìn)行處理。如果是右括號,則直接入棧;否則,遇左括號前將所有的運(yùn)算符全部出棧并輸出,遇右括號后將左右的兩括號一起刪除。
  3. 重復(fù)上述操作2直至掃描結(jié)束,將棧內(nèi)剩余運(yùn)算符全部出棧并輸出,再逆綴輸出字符串。中綴表達(dá)式也就轉(zhuǎn)換為前綴表達(dá)式了。

代碼實(shí)現(xiàn):

function toPloishNotation(input){
    var len = input.length;
    var c, tmpChar;
    var s1 = new Array(); //存放運(yùn)算符
    var s2 = new Array(); //存放操作數(shù)
    var expression = new Array();
    var number;
    var lastIndex = -1;
    for(var i=len-1; i>=0; --i){
        c = input.charAt(i);
        if(!isNaN(c)) {
            lastIndex = readDoubleReverse(input, i);
            number = parseFloat(input.substring(lastIndex,i+1));
            s2.push(number);
            i = lastIndex;
            expression.push(number);
        }else if (isOperator(c)) {
            while(s1.length!=0 && s1[s1.length-1] != ')' && priorityCompare(c, s1[s1.length-1])<0){
                expression.push(s1[s1.length-1]);
                s2.push(calc(s2.pop(),s2.pop(),s1.pop()));
            }
            s1.push(c);
        } else if(c == ')'){
            s1.push(c);
        } else if (c == '('){
            while((tmpChar=s1.pop())!=')'){
                expression.push(tempChar);
                s2.push(calc(s2.pop(),s2.pop(),tempChar));
            }
        } else if (c == ' ') {
            //ignore
        } else {
            alert("error char");
        }
    }
    while(s1.length!=0){
        tempChar = s1.pop();
        expression.push(tempChar);
        s2.push(calc(s2.pop(),s2.pop(),tempChar));
    }
    // while(!expression.isEmpty()){
    //     //輸出前綴表達(dá)式
    // }
    var result = s2.pop();
    var display = document.getElementById("display");
    display.innerHTML = result;
}

//處理小數(shù),遇到操作符返回
function readDoubleReverse(input, start){
    var dotIndex = -1;  //避免多個(gè)小數(shù)點(diǎn)
    var c;
    for(var i=start; i>=0; --i){
        c = input.charAt(i);
        if(c == '.') {
            if (dotIndex != -1) 
                alert("more than 1 dots);")
            else
                dotIndex = i;
        } else if(isNaN(c)) {
            return i+1; 
        } else if(i == 0){
            return 0;
        }
    }
    alert("not a number");
}

//檢測是否是操作符
function isOperator(c){
    return (c=='+' || c=='-' || c=='*' || c=='/');
}

//優(yōu)先級比較
function priorityCompare(op1,op2){
    switch(op1){
        case '+': case '-':
            return (op2 == "*" || op2 == '/' ? -1:0);
        case '*': case '/':
            return (op2 == "+" || op2 == '-' ? 1:0);
    }
    return 1;
}

//數(shù)值計(jì)算
function calc(num1, num2, op){
    switch(op) {
        case '+':
            return num1 + num2;
        case '-':
            return num1 - num2;
        case '*':
            return num1 * num2;
        case '/':
            if(num2 == 0) alert("division is zero");
            else
                return num1/num2;
        default:
            return 0;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容