Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Javascript

जावास्क्रिप्ट में ऑपरेटर वरीयता पर विचार करते हुए गणितीय अभिव्यक्ति का मूल्यांकन

<घंटा/>

समस्या

हमें एक जावास्क्रिप्ट फ़ंक्शन लिखना है जो एक गणितीय अभिव्यक्ति को एक स्ट्रिंग के रूप में लेता है और इसके परिणाम को एक संख्या के रूप में लौटाता है।

हमें निम्नलिखित गणितीय ऑपरेटरों का समर्थन करने की आवश्यकता है -

  • डिवीजन / (फ्लोटिंग-पॉइंट डिवीजन के रूप में)

  • जोड़ +

  • घटाव -

  • गुणन **

ऑपरेटरों का मूल्यांकन हमेशा बाएं से दाएं किया जाता है, और * और / का मूल्यांकन + और - से पहले किया जाना चाहिए।

उदाहरण

निम्नलिखित कोड है -

const exp = '6 - 4';
const findResult = (exp = '') => {
   const digits = '0123456789.';
   const operators = ['+', '-', '*', '/', 'negate'];
   const legend = {
      '+': { pred: 2, func: (a, b) => { return a + b; }, assoc: "left" },
      '-'&: { pred: 2, func: (a, b) => { return a - b; }, assoc: "left" },
      '*': { pred: 3, func: (a, b) => { return a * b; }, assoc: "left" },
      '/': { pred: 3, func: (a, b) => {
      if (b != 0) { return a / b; } else { return 0; }
   }
   }, assoc: "left",
   'negate': { pred: 4, func: (a) => { return -1 * a; }, assoc: "right" }
};
exp = exp.replace(/\s/g, '');
let operations = [];
let outputQueue = [];
let ind = 0;
let str = '';
while (ind < exp.length) {
   let ch = exp[ind];
   if (operators.includes(ch)) {
      if (str !== '') {
         outputQueue.push(new Number(str));
         str = '';
      }
      if (ch === '-') {
         if (ind == 0) {
            ch = 'negate';
         } else {
            let nextCh = exp[ind+1];
            let prevCh = exp[ind-1];
            if ((digits.includes(nextCh) || nextCh === '(' || nextCh === '-') &&
               (operators.includes(prevCh) || exp[ind-1] === '(')) {
                  ch = 'negate';
            }
         }
      }
      if (operations.length > 0) {
         let topOper = operations[operations.length - 1];
         while (operations.length > 0 && legend[topOper] &&
         ((legend[ch].assoc === 'left' && legend[ch].pred <= legend[topOper].pred) ||
         (legend[ch].assoc === 'right' && legend[ch].pred < legend[topOper].pred))) {
            outputQueue.push(operations.pop());
            topOper = operations[operations.length - 1];
         }
      }
      operations.push(ch);
   } else if (digits.includes(ch)) {
      str += ch
   } else if (ch === '(') {
      operations.push(ch);
   } else if (ch === ')') {
      if (str !== '') {
         outputQueue.push(new Number(str));
         str = '';
      }
      while (operations.length > 0 && operations[operations.length - 1] !== '(') {
         outputQueue.push(operations.pop());
      }
      if (operations.length > 0) { operations.pop(); }
   }
   ind++;
}
if (str !== '') { outputQueue.push(new Number(str)); }
   outputQueue = outputQueue.concat(operations.reverse())
   let res = [];
   while (outputQueue.length > 0) {
      let ch = outputQueue.shift();
      if (operators.includes(ch)) {
         let num1, num2, subResult;
         if (ch === 'negate') {
            res.push(legend[ch].func(res.pop()));
         } else {
            let [num2, num1] = [res.pop(), res.pop()];
            res.push(legend[ch].func(num1, num2));
         }
      } else {
         res.push(ch);
      }
   }
   return res.pop().valueOf();
};
console.log(findResult(exp));

आउटपुट

2

  1. जावास्क्रिप्ट स्प्रेड ऑपरेटर

    जावास्क्रिप्ट स्प्रेड ऑपरेटर हमें एक सरणी को अलग-अलग सरणी तत्वों में विस्तारित करने की अनुमति देता है। स्प्रेड ऑपरेटर का उपयोग करने के लिए सरणी नाम से पहले तीन बिंदु (...) होने चाहिए। जावास्क्रिप्ट स्प्रेड ऑपरेटर के लिए कोड निम्नलिखित है - उदाहरण <!DOCTYPE html> <html lang="en"&g

  1. जावास्क्रिप्ट में ग्रुपिंग ऑपरेटर को समझाइए।

    ग्रुपिंग ऑपरेटर का उपयोग अभिव्यक्ति मूल्यांकन की प्राथमिकता को प्रबंधित करने के लिए किया जाता है। जावास्क्रिप्ट में ग्रुपिंग ऑपरेटर के लिए कोड निम्नलिखित है - उदाहरण <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="view

  1. जावास्क्रिप्ट में नामित फ़ंक्शन अभिव्यक्ति

    जावास्क्रिप्ट में नामित फ़ंक्शन अभिव्यक्ति को लागू करने के लिए कोड निम्नलिखित है। उदाहरण <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <