
Stack +++
.pdf
21
Infix To Post 3
// pop all while(top>0)
{post[j]=q[top-1]; j++; top--; } post[j]=0;
i=strlen(post); return i;
} // InfixToPost

22
Priority
int Priority(char c)
{switch (c )
{case ‘(‘: return 0x7FFFFFFF; case ‘)‘: return 0;
case ‘+‘: return 1; case ‘-‘: return 1; case ‘*‘: return 2; case ‘/‘: return 2; case ‘^‘: return 4;
default: return -1;
}// switch
//return -1;
}// Priority

23
Infix To Post - пример
Infix:
(a + b) / (c*d –f)^k
Post:
ab + cd * f – k ^ /
infix |
( |
+ |
) |
/ |
( |
* |
- |
) |
^ |
|
pr |
inf |
1 |
0 |
2 |
inf |
2 |
1 |
0 |
3 |
free |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* 2 |
- 1 |
|
|
|
|
|
+ 1 |
+ 1 |
|
( 0 |
( 0 |
( 0 |
|
^ 3 |
|
|
|
|
|
|
|
|
|
|
||
|
( 0 |
( 0 |
( 0 |
/ 2 / 2 |
/ 2 |
/ 2 |
/ 2 / 2 |
|
||
|
|
|
|
|
|
|
|
|
|
|

24
Вычисление постфиксного выражения
Алгоритм:
1)взять очередной элемент;
2)если это операнд - не знак операции, добавить его в стек;
3)если это знак операции, то
•взять из стека два операнда;
•выполнить операцию и записать результат в стек; 4) перейти к шагу 1.

25
Вычисление постфиксного выражения
Post:
ab + cd * f – k ^ /
+ |
|
|
* |
|
- |
|
^ |
/ |
|
|
|
|
|
|
|
|
|
|
|
d |
|
f |
|
k |
|
|
|
|
|
|
|
|
|
|
|
b |
c |
c |
c*d |
c*d |
c*d-f |
c*d-f |
(c*d-f)^k |
|
|
|
|
|
|
|
|
|
|
a a a+b |
a+b |
a+b |
a+b |
a+b |
a+b |
a+b |
a+b |
|
|
|
|
|
|
|
|
|
|

26
Очередь
6
5
4
3
2
1
Очередь – это линейная структура данных, в которой добавление элементов возможно только с одного конца
-конца очереди,
аудаление элементов – только с другого конца
- начала очереди).
FIFO = First In – First Out
Кто первым вошёл, тот первым вышел
Операции с очередью:
1)добавить элемент в конец очереди (Push, Put);
2)удалить элемент с начала очереди (Pop, Get ).

27
Реализация: очередь - массив
1
1 2
1 |
2 |
3 |
|
|
|
|
|
|
|
|
|
|
|
1 2 3
1)при выборке из очереди можно не сдвигать все элементы
2)при выборке из очереди можно сдвигать все элементы

Реализация очереди - кольцевой массив 28
head tail free
1 2
head tail free
|
2 |
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|||
free |
head |
tail |
|||
|
|
|
|
|
|
3 4
tail free head
5 |
3 |
4 |

29
Очередь - кольцевой массив
Очередь пуста: head=n free=0
В очереди 2 элемента: head = free + 2
Очередь полна: head = free

30
Очередь - кольцевой (circular) массив
Структура данных: const int queuesize = 100;
struct QUEUE
{ int data[queuesize]; int head, free;
};
Добавление в очередь:
int Push(QUEUE &q, int n, int x )
{ if( q.free - q.head ==0) return -1; // queue full q.data [q.free] = x;
q.free++;
if(q.free == n) q.free=0; return q.free - q.head;
} //