如何在 Javascript 中将两个数字连接成一个 Stack

How to concatenate two numbers into a Stack in Javascript

所以如果为真,我想连接两个数字。例如,如果用户单击了按钮编号“2”和按钮编号“3”,那么它应该作为 ["23"] 而不是 ["2", "3"] 存储在 Stack 中。无论是 23 还是只有 2,每当您点击运算符(“+”、“-”、“*”、“/”、“=”)时,您都应该点击第二个数字。它适用于 Javascript.

中的计算器

示例: 用户点击 23、+、7,然后点击 =。那应该在堆栈中存储为 ["23", "+", "7", "="],希望你明白了。

已更新

var stack = new Array();
for (let i = 0; i < length; i++)
                {
                    buttons[i].addEventListener("click", handle);
                }

        var prevop = '';

        function handle(event)
        { 
            const value = event.target.value;
            var myFirstInput =+ value;

我被困在这里。

            if(prevop == '+' || prevop == '-' || prevop == '*' ||prevop == '/')
            {
                var mySecondInput =+ value;
                var input = "" + myFirstInput + myFirstInput;
                stack.push(input);
            }

            if (prevop == '=') {
                document.getElementById("textfield").value = "";
            }

            prevop = value;

            switch(value)
            {   
                case "+":
                    console.log("+ was clicked");
                    document.getElementById("textfield").value += value;
                    break;
                case "-":
                    console.log("- was clicked");
                    document.getElementById("textfield").value += value;
                    break;
                case "*":
                    console.log("* was clicked");
                    document.getElementById("textfield").value += value;
                    break;
                case "/":
                    console.log("/ was clicked");
                    document.getElementById("textfield").value += value;
                    break;
                case "=":
                    var tmp = eval(document.getElementById("textfield").value);
                    document.getElementById("textfield").value += value + tmp;
                    break;
                default:
                    console.log("%s was clicked", value);
                    document.getElementById("textfield").value += value;
            }
        }

没有代码有点难以回答,但据我了解你的问题,我的建议是:

只要您的计算器的 + 号没有点击,您就可以将您的 "strings numbers" 与 + 号(不是您计算器的 + 号)连接起来。

数组第一个元素的示例:

"2" + "3" // "23" when 2 and 3 are clicked

通过这样做,您可以继续向数组的第一个元素添加字符串。

然后当您的计算器或任何其他计算符号的 + 符号被点击时,您将“+”(或被点击的符号)作为字符串添加到您的数组中;在索引 1。 这样,数组的前 2 个元素将是 ["23", "+"]

您可以使用一种逻辑来检查数组索引 1 处的元素是否与“+”、“-”、“*”或“/”匹配。如果尚未选择,您可以继续将数字添加到索引 0。 只要索引 3 不等于 =,索引 2 也一样。 这就是我的理解你想做的。这有意义吗?

归根结底,如果您想 return 结果,您可以将所有内容存储为字符串,而不必担心将其设为数组(除非您想跟踪输入的内容单独的元素)。以下是计算结果的方法:

function mathEval(mathString) { // this hack evaluates your math function and immediately returns a result.
  return new Function('return ' + mathString)();
}

console.log(mathEval("23+7")); // 30. You can trigger the eval when the = sign is clicked

您可以检查keyvalue是否为数字,并据此做出选择:

let fooArray = ["2", "3", "+", "7", "=" ]

function testFunction(keyVal) {
    let someArray = [];
    fooArray.forEach((f, i) => {
        if (i != 0) {
            let toBeInserted = fooArray[i - 1];
            if ( isNumeric(f) && isNumeric(toBeInserted)) {
                someArray.push(`${toBeInserted}${f}`);
            } else {
                someArray.push(f);
            }
        } else {
            someArray.push(f);
        }
    });

    return someArray;
}

function isNumeric(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

console.log(testFunction(fooArray));

我实现了最小值 "calculator",它将按照您的描述进行堆栈操作。

https://jsbin.com/maberic/5/edit?html,js,output

window.onload = function() {
    var stack = [];
    var inputField = document.querySelector('#textfield');
    var buttons = [];
    var buttonsContainer = document.querySelector('#buttons');
    var actions = {
        'add': '+',
        'sub': '-',
        'mul': '*',
        'div': '/' // you can use custom symbols e.g. "÷" U+00F7 Division Sign Unicode Character
    };
    var buttonsHandler = function(event) {
        var button = event.target;
        var action = button.getAttribute('action');
        switch (action) {
            case 'input':
                var value = button.getAttribute('value');
                if (stack.length <= 0 || isNaN(parseInt(stack[stack.length - 1], 10))) {
                    // if empty stack or last is sign we can just push
                    stack.push(value)
                } else {
                    // else we need to concat last *number*
                    stack[stack.length - 1] += '' + value; // make sure we have a string
                }
                inputField.value += value;
                break;
            case 'action':
                var op = button.getAttribute('op');
                switch (op) {
                    case 'bs':
                        // implement here backspace logic
                        // e.g. remove last char from number or remove operator entirely
                        break;
                    case 'eq':
                        // implement here logic for "=" button
                        // avoid using eval: https://medium.com/mail-online/eval-is-evil-but-not-why-you-may-think-25961f9b01bb
                        break;
                    case 'cl':
                        stack = [];
                        inputField.value = '';
                        break;
                    default:
                        stack.push(actions[op]);
                        inputField.value += actions[op];
                        break;
                }
                break;
            default:
                break;
        }
        // here you can apply "post" actions for your stack
    };
    /* Buttons "generator" */
    [ {type: 'input', value: 1 },
      {type: 'input', value: 2 },
      {type: 'input', value: 3 },
      {type: 'linebreak' },
      {type: 'input', value: 4 },
      {type: 'input', value: 5 },
      {type: 'input', value: 6 },
      {type: 'linebreak' },
      {type: 'input', value: 7 },
      {type: 'input', value: 8 },
      {type: 'input', value: 9 },
      {type: 'linebreak' },
      {type: 'dummy' },
      {type: 'input', value: 0 },
      {type: 'dummy' },
      {type: 'linebreak' },
      {type: 'action', sign: actions.add, action: 'add'},
      {type: 'action', sign: actions.sub, action: 'sub'},
      {type: 'linebreak' },
      {type: 'action', sign: actions.mul, action: 'mul'},
      {type: 'action', sign: actions.div, action: 'div'},
      {type: 'linebreak' },
      {type: 'action', sign: '=', action: 'eq'},
      {type: 'linebreak' },
      {type: 'action', sign: '< Backspace', action: 'bs'},
      {type: 'action', sign: 'Clear', action: 'cl'} ]
    .forEach(function(elem) {
        switch(elem.type) {
            case 'input':
                var button = document.createElement('button');
                button.innerText = elem.value.toString();
                button.setAttribute('action', 'input');
                button.setAttribute('value', elem.value);
                button.onclick = buttonsHandler;
                buttonsContainer.append(button);
                buttons.push(button);
                break;
            case 'dummy':
                var dummy = document.createElement('button');
                dummy.innerText = '_';
                buttonsContainer.append(dummy);
                break;
            case 'action':
                var action = document.createElement('button');
                action.innerText = elem.sign.toString();
                action.setAttribute('action', 'action');
                action.setAttribute('op', elem.action);
                action.onclick = buttonsHandler;
                buttonsContainer.append(action);
                buttons.push(button);
                break;
            case 'linebreak':
                var br = document.createElement('br');
                buttonsContainer.append(br);
                break;
            default:
                break;
      }
    });
    /* end */
}
<!DOCTYPE html>
<html>
<head>
    <meta name="description" content="Simple calc template">
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width"/>
    <title>Example</title>
</head>
<body>
    <input id="textfield" type="text" readonly="readonly"/>
    <br/>
    <div id="buttons"></div>
</body>
</html>

此外,我建议您不要使用 eval:https://medium.com/@epoberezkin/eval-is-evil-but-not-why-you-may-think-25961f9b01bb

您可以使用您的堆栈。但是你需要记住乘法、除法等操作的顺序。