Ясно, что у меня возникли проблемы с моим действительным оператором выражения. Теоретически, я сначала понимаю концепцию проверки открывателей области, и если вы видите область ближе без открывателя области, то она недопустима. Я не слишком уверен, что это нарисованные мной диаграммы или что, но все же, как я уже сказал, я просто немного растерялся, когда речь заходит об использовании алгоритма при кодировании, какие-нибудь советы? Кроме того, мой профессор сказал мне использовать здесь переключение регистра? Какую пользу это принесет мне? Разве мне не нужны 3 разных переключателя дел для открывателей и доводчиков, когда на самом деле все, что мне нужно, это утверждение if?
//=============use case switch here
void check_expression(char expression[80], bool& valid)
{
Stack symbStack; //stack to hold scope openers
char symbol, //current symbol in the expression being investigated
top_symb; //current scope opener at the top of the stack
int i = 0; //subscript to element in expression array, initialized to
//first element
valid = true;
symb = expression[i];
while(symb != '\0') //while symbol in expression is not the null terminator
{
if( symbol == '{' || symbol == '[' || symbol == '(' )
{
symbStack.Push(symbol);
}
else if( symbol == '}' || symbol == ']' || symbol == ')' )
{
if(symbStack.IsEmpty())
{
cout << "Expression is invalid!";
valid == false;
}
else
{
top_symb = symbStack.StackTop();
symbStack.Pop();
if( (top_symb == '(' && symbol != ')') ||
(top_symb == '[' && symbol != ']') ||
(top_symb == '{' && symbol != '}') )
{
valid = false;
}
}
}
i++; //incrememt the subscript to the next character in the expression.
symb = expression[i]; //assign symb to the next character in expression.
}
//Check to see if the stack is not empty. If it is not empty, then
//the expression is invalid, in which case you want to assign valid to false
return;
}