Вам дана строка, которая представляет собой выражение цифр и операндов. Например, 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 ++
#include <iostream>
using namespace std;
bool isOperand( char c) { return (c >= '0' && c <= '9' ); }
int value( char c) { return (c - '0' ); }
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;
}
|
Джава
class GFG{
static boolean isOperand( char c)
{
return (c >= '0' && c <= '9' );
}
static int value( char c)
{
return ( int )(c - '0' );
}
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);
} }
|
python3
def isOperand(c):
return (c > = '0' and c < = '9' );
def value(c):
return ord (c) - ord ( '0' );
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);
|
C #
using System;
class GFG{
static bool isOperand( char c) {
return (c >= '0' && c <= '9' );
}
static int value( char c) { return ( int )(c - '0' ); }
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);
} }
|
PHP
<?php
function isOperand( $c )
{
return ( $c >= '0' && $c <= '9' );
}
function value( $c )
{
return ( $c - '0' );
}
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" );
?>
|
Выход:
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