Алгоритмы, использующие линейные связанные списки. Тема 7

Содержание

Слайд 2

7.1. Задача вычисления
арифметических выражений

s:=(a+b)*(c+d)/f;

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

Слайд 3

a+b инфиксная форма
+ab префиксная форма
ab+ постфиксная форма

a+b инфиксная форма +ab префиксная форма ab+ постфиксная форма

Слайд 4

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

Операции )

Алгоритм преобразования выражения из инфиксной формы в форму обратной польской записи Операции
( + – * / (возв. в ст.)
Приоритет 0 1 2 3

Слайд 5

7.2. Программа для вычисления
арифметических выражений
(с использованием стека)

7.2. Программа для вычисления арифметических выражений (с использованием стека)

Слайд 6

#include
#include
#include
#include
struct tstk
{
char inf;

#include #include #include #include struct tstk { char inf; tstk *a; };
tstk *a;
};
struct tstkd
{
double inf; tstkd *a;
};

Слайд 7

tstk *AddStack(tstk *sp, char inf)
{ tstk *spt=new tstk;
spt->inf = inf;
spt->a =

tstk *AddStack(tstk *sp, char inf) { tstk *spt=new tstk; spt->inf = inf;
sp;
return spt; }
tstkd *AddStack(tstkd *sp, double inf)
{ tstkd *spt=new tstkd;
spt->inf = inf;
spt->a = sp;
return spt; }

Слайд 8

tstk *ReadStackD(tstk *sp, char &inf)
{
tstk *spt = sp; inf=

tstk *ReadStackD(tstk *sp, char &inf) { tstk *spt = sp; inf= 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; }

Слайд 9

double masz[122];
char str[100], strp[100];

double masz[122]; char str[100], strp[100];

Слайд 10

int priority(char ch) // Вычисление
//приоритета операций
{
switch (ch)
{
case '(':

int priority(char ch) // Вычисление //приоритета операций { switch (ch) { case
case ')‘ : return 0;
case '+': case '-‘ : return 1;
case '*': case '/‘ : return 2;
default: return -1;
}
}

Слайд 11

void AddPostFix(char *strin, char *strout)
{
tstk *sp=NULL;
int n = 0;
char ch, inf;

void AddPostFix(char *strin, char *strout) { tstk *sp=NULL; int n = 0; char ch, inf;

Слайд 12

for (unsigned int i=0; i{
ch=strin[i];
// Если это операнд
if (ch >=

for (unsigned int i=0; i { ch=strin[i]; // Если это операнд if
'A') { strout[n++]=ch; continue; }
// Если стек пуст или открыв.скобка
if (sp == NULL || ch == '(' )
{ sp=AddStack(sp,ch); continue; }

Слайд 13

// Eсли закрывающая скобка
if ( ch == ')' )
{
while (sp->inf !=

// Eсли закрывающая скобка if ( ch == ')' ) { while
'(')
{
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)
{

// Если операция int pr=priority(ch); while (sp != NULL && priority(sp->inf)>=pr) {
sp=ReadStackD(sp,inf);
strout[n++]=inf;
}
sp=AddStack(sp,ch);
} // end for

Слайд 15

while (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'; }

Слайд 16

double rasAV(char *str, double *mz)
{
tstkd *sp=NULL;
char ch;
double inf, inf1, inf2;

double rasAV(char *str, double *mz) { tstkd *sp=NULL; char ch; double inf, inf1, inf2;

Слайд 17

for (unsigned int i=0; i{
ch=str[i];
// если операнд
if (ch >= 'A')

for (unsigned int i=0; i { ch=str[i]; // если операнд if (ch

{
sp=AddStack(sp,mz[int(ch)]);
continue;
}

Слайд 18

sp=ReadStackD(sp,inf2); // Если знак операции
sp=ReadStackD(sp,inf1);
switch (ch)
{
case '+': sp=AddStack(sp,inf1

sp=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; }
Имя файла: Алгоритмы,-использующие-линейные-связанные-списки.-Тема-7.pptx
Количество просмотров: 29
Количество скачиваний: 0