Слайд 27.1. Задача вычисления
арифметических выражений
s:=(a+b)*(c+d)/f;

Слайд 3a+b инфиксная форма
+ab префиксная форма
ab+ постфиксная форма

Слайд 4Алгоритм преобразования выражения
из инфиксной формы в форму
обратной польской записи
Операции )

( + – * / (возв. в ст.)
Приоритет 0 1 2 3
Слайд 5 7.2. Программа для вычисления
арифметических выражений
(с использованием стека)

Слайд 6#include
#include
#include
#include
struct tstk
{
char inf;

tstk *a;
};
struct tstkd
{
double inf; tstkd *a;
};
Слайд 7tstk *AddStack(tstk *sp, char inf)
{ tstk *spt=new tstk;
spt->inf = inf;
spt->a =

sp;
return spt; }
tstkd *AddStack(tstkd *sp, double inf)
{ tstkd *spt=new tstkd;
spt->inf = inf;
spt->a = sp;
return spt; }
Слайд 8tstk *ReadStackD(tstk *sp, char &inf)
{
tstk *spt = sp; inf=

sp->inf;
sp = sp->a;
delete spt;
return sp; }
tstkd *ReadStackD(tstkd *sp, double &inf)
{
tstkd *spt = sp; inf= sp->inf;
sp = sp->a;
delete spt;
return sp; }
Слайд 9double masz[122];
char str[100], strp[100];
![double masz[122]; char str[100], strp[100];](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/990501/slide-8.jpg)
Слайд 10int priority(char ch) // Вычисление
//приоритета операций
{
switch (ch)
{
case '(':

case ')‘ : return 0;
case '+': case '-‘ : return 1;
case '*': case '/‘ : return 2;
default: return -1;
}
}
Слайд 11void AddPostFix(char *strin, char *strout)
{
tstk *sp=NULL;
int n = 0;
char ch, inf;

Слайд 12for (unsigned int i=0; i{
ch=strin[i];
// Если это операнд
if (ch >=
![for (unsigned int i=0; i { ch=strin[i]; // Если это операнд if](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/990501/slide-11.jpg)
'A') { strout[n++]=ch; continue; }
// Если стек пуст или открыв.скобка
if (sp == NULL || ch == '(' )
{ sp=AddStack(sp,ch); continue; }
Слайд 13// Eсли закрывающая скобка
if ( ch == ')' )
{
while (sp->inf !=

'(')
{
sp=ReadStackD(sp, (char) inf);
strout[n++]=inf;
}
// Удаление открывающей скобки
sp=ReadStackD(sp,inf); continue;
}
Слайд 14// Если операция
int pr=priority(ch);
while (sp != NULL && priority(sp->inf)>=pr)
{

sp=ReadStackD(sp,inf);
strout[n++]=inf;
}
sp=AddStack(sp,ch);
} // end for
Слайд 15while (sp != NULL)
{
sp=ReadStackD(sp,inf);
strout[n++]=inf;
}
strout[n++]='\0';
}
![while (sp != NULL) { sp=ReadStackD(sp,inf); strout[n++]=inf; } strout[n++]='\0'; }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/990501/slide-14.jpg)
Слайд 16double rasAV(char *str, double *mz)
{
tstkd *sp=NULL;
char ch;
double inf, inf1, inf2;

Слайд 17for (unsigned int i=0; i{
ch=str[i];
// если операнд
if (ch >= 'A')
![for (unsigned int i=0; i { ch=str[i]; // если операнд if (ch](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/990501/slide-16.jpg)
{
sp=AddStack(sp,mz[int(ch)]);
continue;
}
Слайд 18sp=ReadStackD(sp,inf2); // Если знак операции
sp=ReadStackD(sp,inf1);
switch (ch)
{
case '+': sp=AddStack(sp,inf1

+ inf2); break;
case '-': sp=AddStack(sp,inf1 - inf2); break;
case '*': sp=AddStack(sp,inf1 * inf2); break;
case '/': sp=AddStack(sp,inf1 / inf2); break;
}
}
sp=ReadStackD(sp,inf);
return inf; }