Слайд 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];
Слайд 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 >=
'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';
}
Слайд 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')
{
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; }