Алгоритм вычисления алгебраических выражений
Структуры данных:
Присваиваем операциям приоритеты:
Второй этап - вычисление
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
1+5*(6-2)/2
Список лексем исчерпан. Опустошаем стек S2
УРА!!!
5+8-6*3
5+8-6*3
5+8-6*3
5+8-6*3
5+8-6*3
5+8-6*3
5+8-6*3
5+8-6*3
Список лексем исчерпан Опустошаем стек S2
Продолжаем опустошать стек S2
УРА!!!
Применение деревьев поиска
Постановка задачи:
Проектируем…
Выбираем двоичное дерево!
Исходное состояние БЗ
Загадываем слона.
1-й вопрос программы
2-й вопрос программы
3-й вопрос программы
А теперь загадываем мамонта. Мамонта в базе знаний нет. Посмотрим на поведение программы…
1-й вопрос программы
2-й вопрос программы
3-й вопрос программы
Что должна сделать программа?
Новое состояние БЗ
Первый вопроc:
Второй вопрос:
Третий вопрос (уже новый!)
Последний вопрос
371.00K
Категория: МатематикаМатематика

Алгоритм вычисления алгебраических выражений

1. Алгоритм вычисления алгебраических выражений

2.

Дано выражение в естественной записи
со скобками вида:
5+8/6+(45-7)/3
Необходимо вычислить значение
выражения

3.

Первый этап – разбивка на лексемы
(парсинг)

4.

Лексема это:
- Число
- Знак операции { + - * / }
- Круглые скобки { ( ) }

5. Структуры данных:

Используется два стека:
стек операндов (S1)
и стек операций (S2)

6. Присваиваем операциям приоритеты:

{(}
{+-}
{*/ }
{^}
– приоритет 0;
– приоритет 1;
– приоритет 2;
- приоритет 3.

7. Второй этап - вычисление

8.

Список лексем исчерпан? Да – на п.7;
Берем очередную лексему;
Это число – кладем его в стек S1. На п.1;
Это открывающая скобка – кладем её в стек S2. На п.1;
Это операция – сравниваем её приоритет с приоритетом
вершины стека S2.
Если приоритет операции ВЫШЕ – кладём операцию в
стек S2. На п.1;
Иначе извлекаем из стека S1 ДВА элемента, а из стека S2
– операцию, ВЫПОЛНЯЕМ операцию и результат кладем
в стек S1. Повторяем, пока в стеке операций есть
операции с приоритетом, равным приоритету
пришедшей операции. Пришедшую операцию – в стек!
6.
Это закрывающая скобка – извлекаем из стека S2 операцию,
а из стека S1 пары чисел, ВЫПОЛНЯЕМ операцию,
результат кладем в стек S1. Повторяем п.6 до появления
открывающей скобки. Удаляем ее. На п.1;
7.
Извлекаем из стека S2 операцию, а из стека S1 пары чисел,
ВЫПОЛНЯЕМ операцию, результат кладем в стек S1.
Повторяем п.7 до исчерпания стека S2. Результат – в S1
1.
2.
3.
4.
5.

9. 1+5*(6-2)/2

1
2
3
4
5
6
1
+
5
*
(
6
7 8 2
9 )
10 /
11 2

10. 1+5*(6-2)/2

Вх. Сост:
S1 { }
S2 { }
Вых. Сост:
S1 { 1 }
S2 { }

11. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 }
S2 { }
Вых. Сост:
S1 { 1 }
S2 { + }

12. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 }
S2 { + }
Вых. Сост:
S1 { 1 5}
S2 { + }

13. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 5 }
S2 { + }
Prty(*) > Prty(+)
Вых. Сост:
S1 { 1 5 }
S2 { + * }

14. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 5 }
S2 { + * }
Вых. Сост:
S1 { 1 5 }
S2 { + * ( }

15. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 5 }
S2 { + * ( }
Вых. Сост:
S1 { 1 5 6 }
S2 { + * ( }

16. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 5 6 }
S2 { + * ( }
Prty(-) > Ptry(()
Вых. Сост:
S1 { 1 5 6 }
S2 { + * ( - }

17. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 5 6 }
S2 { + * ( -}
Вых. Сост:
S1 { 1 5 6 2}
S2 { + * ( - }

18. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 5 6 2}
S2 { + * ( - }
A2=2
A1=6
R=(A1-A2)=4
Вых. Сост:
S1 { 1 5 4}
S2 { + * }

19. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 5 4}
S2 { + * }
Prty(/)=Prty(*)
Вых. Сост:
S1 { 1 20}
S2 { + /}

20. 1+5*(6-2)/2

Вх. Сост:
S1 { 1 20}
S2 { + /}
Вых. Сост:
S1 { 1 20 2}
S2 { + /}

21. Список лексем исчерпан. Опустошаем стек S2

Вх. Сост:
S1 { 1 20 2}
S2 { + /}
A2=2
A1=20
R=A1/A2=10
Вых. Сост:
S1 { 1 10}
S2 { + }

22.

Продолжаем опустошать стек S2
Вх. Сост:
S1 { 1 10}
S2 { + }
A2=10
A1=1
R=A1+A2=11
Результат = 11
Вых. Сост:
S1 { 11}
S2 { }

23. УРА!!!

24.

Еще один пример:
5+8-6*3
Необходимо вычислить значение
выражения

25. 5+8-6*3

1
2
3
4
5
6
7
5
+
8
6
*
3

26. 5+8-6*3

Вх. Сост:
S1 { }
S2 { }
Вых. Сост:
S1 { 5 }
S2 { }

27. 5+8-6*3

Вх. Сост:
S1 { 5 }
S2 { }
Вых. Сост:
S1 { 5 }
S2 { + }

28. 5+8-6*3

Вх. Сост:
S1 { 5 }
S2 { + }
Вых. Сост:
S1 { 5 8 }
S2 { + }

29. 5+8-6*3

Вх. Сост:
S1 { 5 8 }
S2 { + }
Prty(+)=Prty(-)
A2=5
A1=8
R=A1+A2=13
Вых. Сост:
S1 { 13 }
S2 { - }

30. 5+8-6*3

Вх. Сост:
S1 { 13 }
S2 { - }
Вых. Сост:
S1 { 13 6 }
S2 { - }

31. 5+8-6*3

Вх. Сост:
S1 { 13 6 }
S2 { - }
Prty(*)>Prty(-)
Вых. Сост:
S1 { 13 6 }
S2 { - *}

32. 5+8-6*3

Вх. Сост:
S1 { 13 6 }
S2 { - *}
Вых. Сост:
S1 { 13 6 3}
S2 { - *}

33. Список лексем исчерпан Опустошаем стек S2

Вх. Сост:
S1 { 13 6 3}
S2 { - *}
A2=3
A1=6
R=A1*A2=18
Вых. Сост:
S1 { 13 18}
S2 { - }

34. Продолжаем опустошать стек S2

Вх. Сост:
S1 { 13 18}
S2 { - }
A2=18
A1=13
R=A1-A2=-5
Результат = -5
Вых. Сост:
S1 { -5 }
S2 { }

35. УРА!!!

36. Применение деревьев поиска

“Угадай животное” – программа,
способная обучаться

37. Постановка задачи:

Программа должна задавать человеку
вопросы и “отгадать” загаданное
человеком животное. Вопросы
должны носить “двоичный характер”
(да-нет).
Если программа не в состоянии
отгадать животное, она “сдаётся”,
спрашивает человека, как
называется животное и чем
отличается от названного…

38.

Эта информация запоминается в “базе знаний”
(БЗ) и может быть использована при
следующих сеансах игры.

39. Проектируем…

Очевидно, что “сердцем” программы
является хранилище данных.
Какую структуру данных выбрать?

40. Выбираем двоичное дерево!

Узел дерева будет хранить текст
вопроса, а правая и левая ссылки
будут указывать на поведение
программы при ответе “Да” (правая) и
“Нет” (левая).

41. Исходное состояние БЗ

42. Загадываем слона.

43. 1-й вопрос программы

44. 2-й вопрос программы

45. 3-й вопрос программы

Ответ “Да” – и Слон вычислен!

46. А теперь загадываем мамонта. Мамонта в базе знаний нет. Посмотрим на поведение программы…

47. 1-й вопрос программы

48. 2-й вопрос программы

49. 3-й вопрос программы

Ответ “нет” и у слона нет потомков в
дереве поиска…

50.

Программа признаёт проигрыш и
спрашивает, как называется загаданное
животное.
Человек отвечает: “Мамонт”
Поскольку программа остановилась на
Слоне, то нужно спросить человека, чем
Мамонт отличается от Слона.
Человек отвечает “Животное вымерло”

51. Что должна сделать программа?

1) Создать новый узел в дереве
поиска и занести в него…
вопрос “Животное вымерло?”
2) “Подвесить” этот узел к предку
Слона
3) У этого нового узла сделать левым
потомком (почему?) узел “Слон?”, а
правым – еще один новый узел (в
него записать “Мамонт?”)

52. Новое состояние БЗ

53.

Еще раз загадаем мамонта и пройдем
по дереву поиска…

54. Первый вопроc:

55. Второй вопрос:

56. Третий вопрос (уже новый!)

57. Последний вопрос

Мамонт успешно угадан…

58.

Вот реальная программа, работающая
по описанному принципу:
http://ru.akinator.com/
English     Русский Правила