Содержание
- 2. В результате наибольшее распространение полу-чил метод трансляции с помощью обратной польской записи, которую предложил польский математик
- 3. Пусть для операндов А и В выполняется операция сложения. Привычная форма записи А+В называется инфиксной. Форма
- 4. Алгоритм, использующий стек Получение ОПЗ с использованием стека может осуществляться весьма просто на основе алгоритма, предложенного
- 5. Суть алгоритма в следующем Исходное выражение, записанное в виде строки символов S, просматривается слева направо. Операнды
- 6. 3. Если в S встретилась закрывающая скобка, то извлекаем из стека и записываем в строку В
- 7. Пример реализации Исходное выражение задано в виде строки S "a + b*c + ( d*e +
- 8. Всего в строке 15 символов (15 п.п.). 1. Букву «a» помещается в строку В 2. Операцию
- 9. 4. Операцию «*» помещаем в стек, т.к. элемент «+» в вершине стека имеет более низкий приоритет.
- 10. 6. Следующая операция «+»: анализируем стек и видим, что в вершине стека «*» и следующая за
- 11. 7. Далее следует символ «(», его помещаем в стек. 8. Букву «d» помещаем в строку В.
- 12. 9. Операцию «*» помещаем в стек, т.к. приоритет у скобки самый низкий. 10. Букву «e» помещаем
- 13. 11. Следующая операция «+»: приоритет операции «*» в вершине стека выше, поэтому извлекаем из стека «*»
- 14. 13. Далее идет закрывающая скобка, все элементы до символа «(» извлекаем из стека и помещаем в
- 15. 14. Операцию «*» помещаем в стек, т.к. ее приоритет выше операции «+» в вершине стека. 15.
- 16. Все символы строки S просмотрены, следова-тельно, анализируем состояние стека, если он не пуст, то переписываем все
- 17. Вычисление выражения, записанного в ОПЗ, может проводиться путем однократного просмотра, что является весьма удобным при генерации
- 18. Выражение (A + B) * (C + D) – E в виде ОПЗ: AB+CD+*E– Его вычисление
- 19. Текст программы, реализующий рассмотренные алгоритмы, может иметь следующий вид: . . . struct Stack { char
- 20. void main () { Stack *t, *Op = NULL; // Стек операций Op – пуст char
- 21. // Анализируем символы строки In for ( k = 0; In[k] != '\0' ; ++k )
- 22. /* 3. Если «)», извлекаем из стека в строку Out все операции до открывающей скобки */
- 23. // Удаляем из стека открывающую скобку t = Op; Op = Op -> next; delete t;
- 24. /* 4. Если операция, извлекаем из стека в Out опе-рации с большим или равным приоритетом */
- 25. /* 5. Если стек не пуст, извлекаем из него операции и записываем в выходную строку */
- 26. Обратите внимание на то, что группа операторов if() в пунктах 1 – 4 организована НЕ ЭФФЕКТИВНО,
- 27. // Функция реализации приоритета операций int Prior ( char a ) { switch ( a )
- 28. // Добавление элемента в стек Stack* InS ( Stack *p, char s ) { Stack *t
- 29. // Извлечение элемента из стека (со ссылкой) Stack* OutS ( Stack *p, char &s ) {
- 30. // ----------- Расчет выражения ОПЗ ----------- double Result (char *str ) { int i; Stack *begin
- 31. for ( i=0; str [ i ] != '\0'; ++i ) { ss = str [
- 32. switch ( ss ) { case '+' : res = op1 + op2; break; case '-'
- 33. Пример, реализованный в методичке для оконного приложения:
- 34. struct Stack { char info; Stack *next; } *begin; int Prior (char); Stack* InStack ( Stack*,
- 35. //---- Текст функции-обработчика FormCreate ---- Edit1->Text = "a+b*(c-d)/e"; Edit2->Text = ""; char a = 'a'; StringGrid1->Cells[0][0]
- 36. // ---- Текст обработчика кнопки Перевести ---- Stack *t; begin = NULL; char ss, a; String
- 37. for (k = 1; k ss = InStr[k]; // ----------- Пункт 1 алгоритма ------------ if (ss
- 38. // ----------- Пункт 3 алгоритма ------------ if ( ss == ')' ) { while ( (begin
- 39. // ----------- Пункт 4 алгоритма ------------ if ( znak.Contains ( ss ) ) { while (
- 40. // ----------- Пункт 5 алгоритма ------------ while ( begin != NULL) { begin = OutStack (
- 41. //---- Текст обработчика кнопки Посчитать ---- char ch; String OutStr = Edit2 -> Text; for (
- 42. //-- Функция реализации приоритета операций -- int Prior ( char a ){ switch ( a )
- 43. //------ Расчет арифметического выражения ------ double Rezult(String Str) { char ch, ch1, ch2, chr; double op1,
- 44. if (! znak.Contains (ch) ) begin = InStack ( begin, ch ); else { begin =
- 46. Скачать презентацию