文字列計算式を指定し、結果を計算します.
面接の1つの問題、その時ただアルゴリズムの構想と大まかな実現のステップだけを言って、今私は完全なことをして、うんうん、私がこのように複雑ではないことを知らないで、みんなが提案することを歓迎して、いっしょに討論します
計算式(加減乗除四則演算を含む)文字列を指定し、計算結果
アルゴリズムの考え方:
1)オペランドとオペレータをそれぞれ配列に順番に格納する
2)オペレータ配列を巡回し、優先度の高い*と/を先に計算するので、Array.includes(「*」,「/」)は、*と/を含むかどうかを判断し、ある場合は、現在のインデックスとオペレータを覚えて返す.
3)オペレータが本来隣接する2つのオペランドを計算し,対応する計算を行い,単一ステップの結果を格納する.
4)計算の最終結果を返す
最近vueを勉強しているからです.jsだからこのdemoはvueの関連文法を使って書いて、主にリアルタイムでデータを見せるためで、便利です.もし皆さんがもっと良い方法があれば、あるいは私のこのアルゴリズムにアドバイスがあれば、ご指導を歓迎します.qq:1358025287
また、私のGitHubにソースコードをダウンロードすることもできます. git clone https://github.com/FlowerOfSummer/compute.git
計算式(加減乗除四則演算を含む)文字列を指定し、計算結果
アルゴリズムの考え方:
1)オペランドとオペレータをそれぞれ配列に順番に格納する
parseInt(str), ; str.substring(0, 1) ,
2)オペレータ配列を巡回し、優先度の高い*と/を先に計算するので、Array.includes(「*」,「/」)は、*と/を含むかどうかを判断し、ある場合は、現在のインデックスとオペレータを覚えて返す.
, ,
3)オペレータが本来隣接する2つのオペランドを計算し,対応する計算を行い,単一ステップの結果を格納する.
, ; , ;
4)計算の最終結果を返す
最近vueを勉強しているからです.jsだからこのdemoはvueの関連文法を使って書いて、主にリアルタイムでデータを見せるためで、便利です.もし皆さんがもっと良い方法があれば、あるいは私のこのアルゴリズムにアドバイスがあれば、ご指導を歓迎します.qq:1358025287
また、私のGitHubにソースコードをダウンロードすることもできます.
var vm = new Vue({
el: "#main",
data: {
str: '', //
result: '', //
nums: [], //
op: [] //
},
methods: {
compute(str) {
// console.log(str);
// ,
while (str.length) {
let num = parseInt(str);
this.nums.push(num);
let numstr = String(num);
str = str.substr(numstr.length);
// console.log(str);
if (str.length != 0) {
this.op.push(str.substring(0, 1));
str = str.substr(1);
// console.log(str);
}
}
// console.log(this.nums, this.op);
// ‘*’ ‘/’
let index = 0;
let opr = '';
let result;
// console.log(111);
// op searchOpr
while (this.op.length > 0) {
// ,
let m = this.searchOpr(index, this.op);
index = m[0];
opr = m[1];
//
if (opr === "*") {
//
result = this.nums[index] * this.nums[index + 1];
// nums ,
this.nums.splice(index, 2);
// ,
this.nums.splice(index, 0, result);
//
this.op.splice(index, 1);
// console.log('*',this.nums,this.op);
} else if (opr === "/") {
result = this.nums[index] / this.nums[index + 1];
this.nums.splice(index, 2);
this.nums.splice(index, 0, result);
this.op.splice(index, 1);
// console.log('/',this.nums,this.op);
} else if (opr === "+") {
result = this.nums[index] + this.nums[index + 1];
this.nums.splice(index, 2);
this.nums.splice(index, 0, result);
this.op.splice(index, 1);
// console.log('+',this.nums,this.op);
} else if (opr === "-") {
result = this.nums[index] - this.nums[index + 1];
this.nums.splice(index, 2);
this.nums.splice(index, 0, result);
this.op.splice(index, 1);
// console.log('-',this.nums,this.op);
}
}
this.result = result;
},
// ,
// , “*” “/”,
searchOpr(index, op) {
let index1;
let opr = '';
if (op.includes("*", "/")) {
for (let i = index; i < op.length; i++) {
if (op[i] === "*") {
opr = '*';
index1 = i;
break;
} else if (op[i] === "/") {
opr = '/';
index1 = i;
break;
}
}
} else {
index1 = 0;
opr = op[0];
}
return [index1, opr];
},
// , ,
reset() {
this.nums = [];
this.op = [];
this.result = "";
this.str = "";
}
}
});