Консультация № 70433
11.01.2007, 09:49
0.00 руб.
0 2 2
Здравствуйте, Уважаемые эксперты! Помогите пожалуйста решить вот такую задачку на С++:
Вычислить значение логического выражения. T - true, F - false. Например: %(&(T,F),T) равно T. % - OR, & - AND. В стек заносятся значения TF и действия.

Обсуждение

Неизвестный
11.01.2007, 09:59
общий
это ответ
Здравствуйте, Чагина Наталья!
Задача сводится к простому разбору строки посимвольно даже, согласно простым правилам:
1. если встретился знак операции (% или &) - заносим в стек после него должна идти отркывающая скобка - если что то другое - ошибка
2. T и F - тоже в стек - после них запятая или закрывающая скобка - иначе ошибка
3. Когда встречаем закрывающую скобку - извлекаем из стека последние три элемента - это должны быть два агрумента в конце и первым - знак операции - иное - ошибка. Вычисляется конкретная операция, удаляются эти три элемента из стека и вместо них пишется результат.

Стек можно организовать как желаете - массивом, вектором, строкой и т. д.
Неизвестный
12.01.2007, 06:23
общий
это ответ
Здравствуйте, Чагина Наталья!
Попробуйте вот такой вариант. Класс стека взят из STL.

Приложение:
#include <iostream>#include <stack>#include <string>using namespace std;int main(int argc, char* argv[]) { string exp("%(&(%(T,T),&(F,T)),F)"); stack<char> stk; string stk_symbols("%&TF"); bool t1, t2; int length = static_cast<int>(exp.length()); for(int i=0; i<length; i++) { if(stk_symbols.find(exp[i]) != string::npos) stk.push(exp[i]); if(exp[i] == ‘)‘) { t1 = (stk.top() == ‘T‘) ? true : false; stk.pop(); t2 = (stk.top() == ‘T‘) ? true : false; stk.pop(); if(stk.top() == ‘&‘) { stk.pop(); stk.push((t1 & t2) ? ‘T‘ : ‘F‘); } if(stk.top() == ‘%‘) { stk.pop(); stk.push((t1 | t2) ? ‘T‘ : ‘F‘); } } } bool result = (stk.top() == ‘T‘) ? true : false; cout << "Expression "" << exp << "" result is " << result << endl; return 0;}
Форма ответа