#include
#include
#include
#include
#include
char st[80]; ///Стек для операций
int n=80; ///Количество макс. операций
int priority (char a) ///Функция выявления приоритета (готова)
{
int n;
switch (a)
{
case '*': ///Если это * или / , то наивысшее
case '/': ///значение приоритета (3)
{ n = 3; break; }
case '-': ///Если это + или - , то среднее
case '+': ///значение приоритета (2)
{ n = 2; break; }
case '(': ///Если это (, то самое низкое значение
{ n = 1; break; } ///приоритета (1)
}
return n;
}
void operation_plus (int *top, int x) ///Функция для заноса операций в стек (готова)
{
*top=*top+1; ///Собственно когда приходим с переменной, то повышаем значение top на 1
st[*top]=x; ///И присваиваем этому значению (макс.) значение новой операции
}
char operation_minus (int *top) ///Функция для выноса операций из стек (готова)
{
char x; ///Выводной символ
x=st[*top]; ///Он равен последнему значению в стек
*top=*top-1; ///Теперь опускаемся ниже
return x; ///Передаем операцию
}
int main() ///Сама функция лексатора (в дальнейшем оформить отдельной ф-ей)
{
int top=0; ///Изначальное значение стек = 0;
char a[80], ///Исходная строка
out[80]; ///Выводная строка
int k=0, ///Счетчики
p=0;
printf("Vvedite virajenie:");
scanf("%s", a); ///Вводим исходное значение
while ( a[k]!='\0' ) ///Пока строка не законччилась
{
if ( a[k]==')' ) ///Если встречаем ), то
{
while( st[top]!='(' ) ///Все значения в стеке до ( выполняем
{
out[p++]=operation_minus(&top);
}
operation_minus(&top); ///Чистим эту скобочку
}
if ( a[k] >='a' && a[k]<='z') ///Если значение символа - константа (буква), то
{
out[p++]=a[k]; ///Заносим в выводную строку стразу
}
if ( a[k] == '(' ) ///Если значение символа это (, то
{
operation_plus(&top, '('); ///Передаем в ф-ю количество операций в стеке и код (
}
if ( a[k]=='+' || a[k]=='-' || a[k]=='/' || a[k]=='*' ) ///Если значение символа это знак, то
{
if ( top==0 ) ///Если в стеке ничего нет, то сразу туда и заносим наше значение
{
operation_plus(&top, a[k]);
}
else ///Если же нет, то проверяем приоритет
{
if ( priority(st[top]) < priority(a[k]) ) ///Если приоритет того, что есть, больше, того, что сейчас, то
{
operation_plus(&top, a[k]); ///Ставим то, что есть сейчас, на топ стека
}
else ///Если приоритет того, что есть, меньше, того, что сейчас, то
{
while ( priority(st[top]) >= priority(a[k]) ) ///Пока приоритет того, что в стеке, больше (равен) того, что сейчас
{
out[p++]=operation_minus(&top); ///Присваиваем значение операции к последнему в выводной строке
///По сути делаем операци
}
}
}
}
k++; ///Переходим на другой символ
}
while(top!=0)
{
out[p++]=operation_minus(&top);
}
printf("\nPolychennaya obratnaya pol'skaya zapis\n %s\n", out);
return 0;
}