Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПособиеСтруктДанн.doc
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
2 Мб
Скачать
☆

If(isalpha(z)) return 'б'; // буква – операнд

for(i=0;i<sizeof(tpri)/sizeof(opri);i++){

if(z==tpri[i].oper){

vhpri=tpri[i].prior;

return 'о'; // знак операции

}

}

return 'н'; // недопустимый символ

}

//-------------------------------------------------

Int Poliz(char *in,char *out){

// in – входная строка

// out – выходная строка

// функция возвращает 0 в случае успеха или номер ошибки

int i,j,v;

opri Stack[MAXSTACK];

j=-1; // Номер очередного выходного символа

v=-1; // указатель на вершину стека

for(i=0;i<strlen(in);i++){

switch (Class(in[i])) {

case 'б': // буква

// Операнды сразу помещаются в выходную строку

out[++j]=in[i];

break;

case 'о': // операция

// Операция выталкивает из стека все операции

// с приоритетом >=

while(v>=0 && vhpri<=Stack[v].prior){

out[++j]=Stack[v--].oper;

}

// после чего сама помещается в стек

Stack[++v].oper=in[i];

Stack[v].prior=vhpri;

break;

case '(':

// Открывающая скобка просто помещается в стек

// как операция с самым низким приоритетом

Stack[++v].oper=in[i];

Stack[v].prior=0;

break;

case ')':

// Закрывающая скобка выталкивает из стека всё,

// вплоть до открывающей скобки включительно

// но сама в стек не помещается

for(;v>=0;v--){

if(Stack[v].oper=='('){

break;

} else {

out[++j]=Stack[v].oper;

}

}

if(v<0){

return 1; // Непарная открывающая скобка

}

v--;

break;

case 'н':

return 2; // недопустимый символ

default:

return 9; // Ошибка в программе

} /* switch */

out[j+1]=0;

} /* for i */

/* Остаток стека – на выход */

for(;v>=0;v--){

if(Stack[v].oper=='('){

// Непарная открывающая скобка

return 3;

}

out[++j]=Stack[v].oper;

}

out[++j]=0;

return 0;

} // Poliz

2.1.4. Вычисление выражения, представленного в полиз

Вычисление выражения, представленного обратной польской записью, выполняется за один проход слева направо. Операнды сначала помещаются в стек. Когда встречается символ операции, то она выполняется над операндами, находящимися на вершине стека. После выполнения операции, её операнды заменяются в стеке результатом операции. В качестве примера рассмотрим выражение в польской записи .

Входной символ

Стек

Примечание

4

4

A

A4

x

R0

R0=4xA

2

2R0

X

X2R0

/

R1R0

R1=2xX

-

R0

R0=R0-R1

3

3R0

B

B3R0

x

R1R0

R1=3xB

2

2R1R0

Y

Y2R1R0

x

R2R1R0

R2=2xY

+

R1R0

R1=R1+R2

x

R0

R0=R0xR1

Результат получен в единственном оставшемся элементе стека.