Перевод арифметических выражений в обратную польскую нотификацию - C (СИ)
Формулировка задачи:
Здравствуйте, извините что обращаюсь, но больше некуда. Пробовал поискать решение в интернете, испробовал разные идеи, но не получается сделать. Преподаватели не помогают, знакомые сами мучаются.
Сама трудность, на основе заданного кода, составить облегченный вариант кода для перевода простейших выражений в обратную польскую запись. Промучался неделю и решил написать сюда.
Основа для кода:
Да, сам код используется для счета арифметических выражений, но надо отталкиваться от него, т.е. использовать схожее построение и стеки в целом.
#include <stdio.h>
#include <conio.h>
int Chislo(char text[],int *i)
{int c=0;
while(text[*i]>='0' && text[*i]<='9')
{c=c*10+(text[*i]-'0');
(*i)++;
}
return c;
}
main()
{
char text[20];
int i;
float opd[3];
char opc[3];
int pr[3];
int j=-1;
printf("Vvedite arifmeticheskoe vyrajenie, v konce probel\n");
gets(text);
i=-1;
do
{i++;
opd[++j]=Chislo(text,&i);
opc[j]=text[i];
switch(text[i])
{case'+':
case'-':pr[j]=1;break;
case'*':
case'/':pr[j]=2;break;
case' ':pr[j]=0;
}
while (j>0 && pr[j]<=pr[j-1])
{switch (opc[j-1])
{case'+': opd[j-1]=opd[j-1]+opd[j]; break;
case'-': opd[j-1]=opd[j-1]-opd[j]; break;
case'*': opd[j-1]=opd[j-1]*opd[j]; break;
case'/': opd[j-1]=opd[j-1]/opd[j]; break;
}
opc[j-1]=opc[j];
pr[j-1]=pr[j];
j=j-1;
}
}
while(text[i]!=' ');
printf(text);
getch();
}Решение задачи: «Перевод арифметических выражений в обратную польскую нотификацию»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
main()
{char text[20];
int i=0;
int pr[3];
float opd[3];
char opc[3];
int j=-1;
int m=0,k=0;
printf("\n Vvedite arifm. vyrajenie:\n");
gets(text);
for(i=0; i<20; i++)
if(text[i]>='a' && text[i]<='g')
printf("%c",text[i]);
i=0;
do
{++i;
opd[++j]=text[i];
opc[j]=text[i];
switch(text[i])
{case'+':
case'-':pr[j]=1;break;
case'*':
case'/':pr[j]=2;break;
case' ':pr[j]=0;
}
while (j>0 && pr[j]<=pr[j-1])
{switch (opc[j-1])
{case'+': printf("+"); break;
case'-': printf("-"); break;
case'*': printf("*"); break;
case'/': printf("/");
}
opc[j-1]=opc[j];
pr[j-1]=pr[j];
j=j-1;
}
++i;
}
while(text[i]!=' ');
getch();
}
Объяснение кода листинга программы
В этом коде переводится арифметическое выражение в обратную польскую нотацию (postfix notation). Список действий:
- Ввод арифметического выражения с клавиатуры.
- Инициализация массивов для хранения символов, чисел и операций.
- Проход по всем символам введенного выражения.
- Если текущий символ является оператором (+, -, *, /), то в массив операций записывается этот оператор и в массив чисел записывается 1.
- Если текущий символ является пробелом, то проверяется следующее: 5.1. Если в массиве операций есть элементы, то они выводятся на экран вместе с оператором. 5.2. Если в массиве операций нет элементов, то программа завершается.
- Если текущий символ не является оператором или пробелом, то он игнорируется.
- После обработки всех символов, программа завершается.