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; просмотров: 1150;