計(jì)算機(jī)算法實(shí)現(xiàn)步驟
- 構(gòu)造兩個(gè)棧,s1,s2分別存儲運(yùn)算符與操作數(shù)
- 從右至左掃描中綴表達(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)算符全部出棧并輸出,遇右括號后將左右的兩括號一起刪除。
- 重復(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ù)。