Static unsigned char vhpri;

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

static char Class(char z){

// Классификация символов из входной строки

// Символ может быть отнесен к одному из классов:

// - 'б' – буква (операнд)

// - 'о' – операция

// - '('

// - ')'

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

Int i;

if(z=='(' || z==')') return z;

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=='('){

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








Дата добавления: 2014-12-02; просмотров: 1159;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.