// 对于字符处理的任务,在很多情况下,我们都被要求按照特定规则去解析字符串然后返回结果。
// 比如,我们需要得出如下计算式的结果:
// 1 * (20 - 300 )
// 在进行具体的计算之前,我们首先需要取得各个 "关键词"(tokens) 并且忽略空格,比如:
// '1','*', '(', '20', '-', '300', ')'
// 然后我们就可以比较容易的进行具体处理了。
// 请实现一个简单四则运算的tokenize() ,像如下这样工作:
// const tokens = tokenize(' 1 * (20 - 300 ) ')
// while (true) {
// let token = tokens.next()
// if (token.done) {
// break
// }
// console.log(token.value)
// }
// or you can use for ... of
// for (let token of tokens) {
// console.log(token)
// }
// 因为实现不困难,在实际的面试中,你可以和面试官交涉说最后再实现tokenizer,这样你可以留下更多时间处理重要的逻辑。
// 输入
// 输入的字符串只包括非负整数字符和+、-、 *、 /、 (、 ) 和空格,空格需要忽略。
// 你的实现需要返回 Generator。
function *tokenize(str) {
let i = 0;
let len = str.length;
while(i < len ) {
let char = str[i];
if(char === '') {
i++;
continue;
}
if(['+','-','*','/','(',')'].includes(str[i])) {
yield char;
i++;
continue;
};
if(!isNaN(Number(char))) {
let numBuf = '';
while(i < len && !isNaN(Number(str[i])) && str[i] !== '') {
numBuf += str[i];
i++;
};
yield numBuf;
continue;
};
i++;
};
};
// ===== 测试示例 =====
const tokens = tokenize(' 1 * (20 - 300 ) ');
console.log("=== while next() 方式 ===");
while (true) {
const res = tokens.next();
if (res.done) break;
console.log(res.value);
}
console.log("\n=== for‑of 方式 ===");
// 注意:生成器只能迭代一次,需要重新调用tokenize
for (const t of tokenize(' 1 * (20 - 300 ) ')) {
console.log(t);
}
console