SOURCE

// 对于字符处理的任务,在很多情况下,我们都被要求按照特定规则去解析字符串然后返回结果。

// 比如,我们需要得出如下计算式的结果:

//  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 命令行工具 X clear

                    
>
console