Рубрики

Программа для оценки простых выражений

Вам дана строка, которая представляет собой выражение цифр и операндов. Например, 1 + 2 * 3, 1-2 + 4. Вам нужно оценить строку или выражение. НИКАКИХ БОДМАС не последует Если выражение имеет неправильный синтаксис, верните -1.
Тестовые случаи:
а) 1 + 2 * 3 будет оцениваться до 9.
б) 4-2 + 6 * 3 будет оцениваться до 24.
c) 1 ++ 2 будет оценено как -1 (недействительно).
Также в строке могут появляться пробелы. Для этого случая мы должны игнорировать пробелы. Как: — 1 * 2 -1 равно 1.

Источник: Amazon Интервью Вопрос

Настоятельно рекомендуем свернуть браузер и попробовать это самостоятельно.
Идея проста — начать с первого символа и пройти слева направо и проверить наличие ошибок, таких как два последовательных оператора и операнда. Мы также отслеживаем результат и обновляем результат при обходе выражения.

Ниже приводится программа для оценки данного выражения.

C ++

// C ++ программа для оценки заданного выражения
#include <iostream>

using namespace std;

  
// Утилита для проверки, является ли данный символ операндом

bool isOperand(char c) { return (c >= '0' && c <= '9'); }

  
// функция полезности для поиска значения и операнда

int value(char c) {  return (c - '0'); }

  
// Эта функция вычисляет простые выражения. Возвращает -1, если
// данное выражение недопустимо.

int evaluate(char *exp)

{

    // Базовый случай: данное выражение пусто

    if (*exp == '\0'return -1;

  

    // Первый символ должен быть операндом, найти его значение

    int res = value(exp[0]);

  

    // Обходим оставшиеся символы в парах

    for (int i = 1; exp[i]; i += 2)

    {

        // Следующий символ должен быть оператором, и

        // рядом с следующим операндом

        char opr = exp[i], opd = exp[i+1];

  

        // Если рядом со следующим символом нет операнда

        if (!isOperand(opd))  return -1;

  

        // Обновить результат согласно оператору

        if (opr == '+')       res += value(opd);

        else if (opr == '-')  res -= value(opd);

        else if (opr == '*')  res *= value(opd);

        else if (opr == '/')  res /= value(opd);

  

        // Если не действительный оператор

        else                  return -1;

    }

    return res;

}

  
// Программа драйвера для проверки вышеуказанной функции

int main()

{

    char expr1[] = "1+2*5+3";

    int res = evaluate(expr1);

    (res == -1)? cout << expr1 << " is " << "Invalid\n":

                 cout << "Value of " << expr1 << " is " << res << endl;

  

    char expr2[] = "1+2*3";

    res = evaluate(expr2);

    (res == -1)? cout << expr2 << " is " << "Invalid\n":

                 cout << "Value of " << expr2 << " is " << res << endl;

  

    char expr3[] = "4-2+6*3";

    res = evaluate(expr3);

    (res == -1)? cout << expr3 << " is " << "Invalid\n":

                 cout << "Value of " << expr3 << " is " << res << endl;

  

    char expr4[] = "1++2";

    res = evaluate(expr4);

    (res == -1)? cout << expr4 << " is " << "Invalid\n":

                 cout << "Value of " << expr4 << " is " << res << endl;

    return 0;

}

Джава

// Java-программа для оценки заданного выражения

  

class GFG{

// Полезная функция для проверки
// данный символ является операндом

static boolean isOperand(char c) 

    return (c >= '0' && c <= '9'); 

      

  
// функция полезности для поиска значения и операнда

static int value(char c)

    return (int)(c - '0');

      

  
// Эта функция вычисляет простые выражения.
// Возвращает -1, если данный
// выражение недопустимо.

static int evaluate(String exp) 

    // Базовый случай: данное выражение пусто

    if (exp.length() == 0) return -1

  

    // Первый символ должен быть

    // операнд, найти его значение

    int res = value(exp.charAt(0)); 

  

    // Обходим оставшиеся символы в парах

    for (int i = 1; i<exp.length(); i += 2

    

        // Следующий символ должен быть оператором, и

        // рядом с следующим операндом

        char opr = exp.charAt(i), opd = exp.charAt(i+1); 

  

        // Если рядом со следующим символом нет операнда

        if (isOperand(opd) == false) return -1

  

        // Обновить результат согласно оператору

        if (opr == '+') res += value(opd); 

        else if (opr == '-') res -= value(opd); 

        else if (opr == '*') res *= value(opd); 

        else if (opr == '/') res /= value(opd); 

  

        // Если не действительный оператор

        else                 return -1

    

    return res; 

  
// Программа драйвера для проверки вышеуказанной функции

public static void main(String[] args) 

    String expr1 = "1+2*5+3"

    int res = evaluate(expr1); 

    if(res == -1) System.out.println(expr1+" is Invalid"); 

    else     System.out.println("Value of "+expr1+" is "+res); 

  

    String expr2 = "1+2*3"

    res = evaluate(expr2); 

    if(res == -1) System.out.println(expr2+" is Invalid"); 

    else         System.out.println("Value of "+expr2+" is "+res);

  

    String expr3 = "4-2+6*3"

    res = evaluate(expr3); 

    if(res == -1) System.out.println(expr3+" is Invalid"); 

    else         System.out.println("Value of "+expr3+" is "+res);

  

    String expr4 = "1++2"

    res = evaluate(expr4); 

    if(res == -1) System.out.println(expr4+" is Invalid"); 

    else         System.out.println("Value of "+expr4+" is "+res);


}
// Этот код предоставлен mits

python3

# Python3 программа для оценки
# данное выражение

  
# Полезная функция для проверки
# данный символ является операндом

def isOperand(c): 

   

    return (c >= '0' and c <= '9'); 

  
# полезная функция для поиска
# значение и операнд

def value(c): 

    return ord(c) - ord('0'); 

  
# Эта функция оценивает простое
# выражения. Возвращает -1, если
# данное выражение недопустимо.

def evaluate(exp):

  

    len1 = len(exp);

      

    # Базовый случай: данное выражение пусто

    if (len1 == 0):

        return -1;

  

    # Первый символ должен быть

    # операнд, найдите его значение

    res = value(exp[0]);

  

    # Пройдите через оставшиеся

    # символов в парах

    for i in range(1,len1,2):

        # Следующий символ должен быть

        # оператор и рядом с

        # следующий операнд

        opr = exp[i];

        opd = exp[i + 1];

  

        # Если рядом со следующим символом

        # не является операндом

        if (isOperand(opd)==False):

            return -1;

  

        # Обновить результат согласно

        # оператору

        if (opr == '+'):

            res += value(opd);

        elif (opr == '-'):

            res -= int(value(opd));

        elif (opr == '*'):

            res *= int(value(opd));

        elif (opr == '/'):

            res /= int(value(opd));

  

        # Если не действительный оператор

        else:

            return -1;

      

    return res;

  
Код водителя

expr1 = "1+2*5+3";

res = evaluate(expr1);

print(expr1,"is Invalid") if (res == -1) else print("Value of",expr1,"is",res);

  

expr2 = "1+2*3";

res = evaluate(expr2);

print(expr2,"is Invalid") if (res == -1) else print("Value of",expr2,"is",res);

  

expr3 = "4-2+6*3";

res = evaluate(expr3);

print(expr3,"is Invalid") if (res == -1) else print("Value of",expr3,"is",res);

  

expr4 = "1++2";

res = evaluate(expr4);

print(expr4,"is Invalid") if (res == -1) else print("Value of",expr4,"is",res);

  
# Этот код предоставлен mits

C #

// C # программа для оценки заданного выражения

using System;

class GFG{

      
// Полезная функция для проверки
// данный символ является операндом

static bool isOperand(char c) { 

    return (c >= '0' && c <= '9'); 

      

  
// функция полезности для поиска значения и операнда

static int value(char c) { return (int)(c - '0'); } 

  
// Эта функция оценивает простое
// выражения. Возвращает -1, если
// данное выражение недопустимо.

static int evaluate(string exp) 

    // Базовый случай: данное выражение пусто

    if (exp.Length == 0) return -1; 

  

    // Первый символ должен быть

    // операнд, найти его значение

    int res = value(exp[0]); 

  

    // Обходим оставшиеся символы в парах

    for (int i = 1; i<exp.Length; i += 2) 

    

        // Следующий символ должен быть оператором, и

        // рядом с следующим операндом

        char opr = exp[i], opd = exp[i+1]; 

  

        // Если рядом со следующим символом нет операнда

        if (isOperand(opd)==false) return -1; 

  

        // Обновить результат согласно оператору

        if (opr == '+') res += value(opd); 

        else if (opr == '-') res -= value(opd); 

        else if (opr == '*') res *= value(opd); 

        else if (opr == '/') res /= value(opd); 

  

        // Если не действительный оператор

        else                 return -1; 

    

    return res; 

  
// Программа драйвера для проверки вышеуказанной функции

static void Main() 

    string expr1 = "1+2*5+3"

    int res = evaluate(expr1); 

    if(res == -1) 

    Console.WriteLine(expr1+" is Invalid"); 

    else     

    Console.WriteLine("Value of "+expr1+" is "+res); 

  

    string expr2 = "1+2*3"

    res = evaluate(expr2); 

    if(res == -1) 

    Console.WriteLine(expr2+" is Invalid"); 

    else         

    Console.WriteLine("Value of "+expr2+" is "+res);

  

    string expr3 = "4-2+6*3"

    res = evaluate(expr3); 

    if(res == -1) 

    Console.WriteLine(expr3+" is Invalid"); 

    else         

    Console.WriteLine("Value of "+expr3+" is "+res);

  

    string expr4 = "1++2"

    res = evaluate(expr4); 

    if(res == -1) 

    Console.WriteLine(expr4+" is Invalid"); 

    else         

    Console.WriteLine("Value of "+expr4+" is "+res);


}
// Этот код предоставлен mits

PHP

<?php
// PHP программа для оценки
// данное выражение

  
// Полезная функция для проверки
// данный символ является операндом

function isOperand($c

    return ($c >= '0' && $c <= '9'); 

}

  
// полезная функция для поиска
// значение и операнд

function value($c

    return ($c - '0'); 

}

  
// Эта функция оценивает простое
// выражения. Возвращает -1, если
// данное выражение недопустимо.

function evaluate($exp)

{

    $len = strlen($exp);

      

    // Базовый случай: данное выражение пусто

    if ($len == 0) return -1;

  

    // Первый символ должен быть

    // операнд, найти его значение

    $res = (int)(value($exp[0]));

  

    // Обходим оставшиеся

    // символы в парах

    for ($i = 1; $i < $len; $i += 2)

    {

        // Следующий символ должен быть

        // оператор и рядом с

        // следующий операнд

        $opr = $exp[$i];

        $opd = $exp[$i + 1];

  

        // Если рядом со следующим символом

        // не является операндом

        if (!isOperand($opd)) 

        return -1;

  

        // Обновить результат в соответствии

        // оператору

        if ($opr == '+')     

        $res += value($opd);

        else if ($opr == '-'

            $res -= (int)(value($opd));

        else if ($opr == '*'

            $res *= (int)(value($opd));

        else if ($opr == '/'

            $res /= (int)(value($opd));

  

        // Если не действительный оператор

        else                

        return -1;

    }

    return $res;

}

  
// Код драйвера

$expr1 = "1+2*5+3";

$res = evaluate($expr1);

($res == -1) ? print($expr1." is Invalid\n"):

               print("Value of " . $expr1

                     " is " . $res . "\n");

              

$expr2 = "1+2*3";

$res = evaluate($expr2);

($res == -1) ? print($expr2." is Invalid\n"):

               print("Value of " . $expr2

                     " is " . $res . "\n");

              

$expr3 = "4-2+6*3";

$res = evaluate($expr3);

($res == -1) ? print($expr3." is Invalid\n"):

               print("Value of " . $expr3

                     " is " . $res . "\n");

              

$expr4 = "1++2";

$res = evaluate($expr4);

($res == -1) ? print($expr4." is Invalid\n"):

               print("Value of " . $expr4 .

                     " is " . $res . "\n");

  
// Этот код предоставлен mits
?>


Выход:

Value of 1+2*5+3 is 18
Value of 1+2*3 is 9
Value of 4-2+6*3 is 24
1++2 is Invalid

Приведенный выше код не обрабатывает пробелы. Мы можем обработать пробелы, сначала удалив все пробелы из заданной строки. Лучшее решение — обрабатывать пробелы в одном обходе. Это оставлено в качестве упражнения.

Сложность времени равна O (n), где n — длина данного выражения.

Эта статья предоставлена Abhishek . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Программа для оценки простых выражений

0.00 (0%) 0 votes