摘要:之前面试遇到的一个字符串加减法的操作,给定一个包含数字,+,- 的字符串,求该字符串的数字运算结果;这个题目是简化过的题目;本来应该包含加、减、乘、除的;利用栈的思想就可解答本题。正数直接入栈,负数相反数入栈,乘除把栈顶元素出栈再与当前数字做运算后将结果入栈。最后栈中元素全部相加得到结果值。涉及Number、isNAN、字符串拼接等知识点;
一、不包含乘除的解法:
const fun = (s) => {
let op = '+';
const stack = [];
let temp = '';
for(item of s){
if(item!=''&&!isNaN(Number(item))){
temp += item;
}
if(isNaN(Number(item))){
switch(op){
case '+':
stack.push(Number(temp));break;
case '-':
stack.push(-Number(temp));break;
}
op = item;
temp = '';
}
}
if(op=='+'){
stack.push(Number(temp))
}else{
stack.push(-Number(temp))
}
let r = 0;
while(stack.length>0){
r += stack.pop()
}
return r;
}
const str = '11+2+3-4+5'
console.log(fun(str));
二、包含乘除的解法
var calculate = function(s) {
//栈的思想
s = s.trim(); //去掉字符前后的空格
const stack = new Array();
let preSign = '+';
const n = s.length;
let temp = '';
//入栈处理
for (let i = 0; i < n; ++i) {
if (!isNaN(Number(s[i])) && s[i] !== ' ') {
temp += s[i];
}
if (isNaN(Number(s[i])) || i === n - 1) {
switch (preSign) {
case '+':
stack.push(Number(temp));
break;
case '-':
stack.push(-Number(temp));
break;
case '*':
stack.push(stack.pop() * Number(temp));
break;
default:
stack.push(stack.pop() / Number(temp) | 0);
}
preSign = s[i];
temp = '';
}
}
let ans = 0;
while (stack.length) {
ans += stack.pop();
}
return ans;
};