#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
struct tstk {
double inf;
tstk *a;
};
tstk *AddStack(tstk *sp, double inf) {
tstk *spt = new tstk;
spt->inf = inf;
spt->a = sp;
return spt;
}
tstk *ReadStack(tstk *sp, double &inf) {
tstk *spt = sp;
inf = sp->inf;
sp = sp->a;
delete spt;
return sp;
}
double masz[122];
char str[100], strp[100];
int priority(char ch) { // Вычисление приоритета операций
switch (ch) {
case '(':
case ')': return 0;
case '+':
case '-': return 1;
case '*':
case '/': return 2;
default: return -1;
}
}
void AddPostFix(char *strin, char *strout) {
tstk *sp = NULL;
int n = 0;
char ch;
double inf;
for (unsigned int i = 0; i < strlen(strin); i++) {
ch = strin[i];
// Если это операнд
if (ch >= 'A') {
strout[n++] = ch;
continue;
}
// Если стек пуст или найдена открывающая скобка
if (sp == NULL || ch == '(') {
sp = AddStack(sp, ch);
continue;
}
// Если найдена закрывающая скобка
if (ch == ')') {
while (sp->inf != '(') {
sp = ReadStack(sp, inf);
strout[n++] = (char)inf;
}
sp = ReadStack(sp, inf); // Удаление открывающей скобки
continue;
}
// Если операция
int pr = priority(ch);
while (sp != NULL && priority((char)sp->inf) >= pr) {
sp = ReadStack(sp, inf);
strout[n++] = (char)inf;
}
sp = AddStack(sp, ch);
} // end for
while (sp != NULL) {
sp = ReadStack(sp, inf);
strout[n++] = (char)inf;
}
strout[n++] = '\0';
}
int main() {
cout << "Vvedite a" << endl;
cin >> masz[int('a')];
cout << "Vvedite b" << endl;
cin >> masz[int('b')];
cout << "Vvedite c" << endl;
cin >> masz[int('c')];
cout << "Vvedite d" << endl;
cin >> masz[int('d')];
cout << "Vvedite f" << endl;
cin >> masz[int('f')];
cout << "Vvedite viragenie (a ,b, c, d, f)" << endl;
cin >> str;
AddPostFix(str, strp);
cout << endl << strp;
return 0;
}