Загрузка данных
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cmath>
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;
case '^': return 3;
case '~': case '#': return 4;
case '!': return 5;
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 == '-' && (i == 0 || strin[i-1] == '(')) {
ch = '~';
}
if (ch == '+' && (i == 0 || strin[i-1] == '(')) {
ch = '#';
}
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) {
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)
{
int stack_pr = priority((char)sp->inf);
if (ch == '^' || ch == '~' || ch == '#') {
if (stack_pr > pr) {
sp = ReadStack(sp, inf);
strout[n++] = (char)inf;
} else {
break;
}
} else {
if (stack_pr >= pr) {
sp = ReadStack(sp, inf);
strout[n++] = (char)inf;
} else {
break;
}
}
}
sp = AddStack(sp, ch);
}
while (sp != NULL)
{
sp = ReadStack(sp, inf);
strout[n++] = (char)inf;
}
strout[n++] = '\0';
}
double rasAV(char *str, double *mz)
{
tstk *sp = NULL;
char ch;
double inf, inf1, inf2;
for (unsigned int i = 0; i < strlen(str); i++)
{
ch = str[i];
if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
sp = AddStack(sp, mz[int(ch)]);
continue;
}
if (ch >= '0' && ch <= '9') {
sp = AddStack(sp, ch - '0');
continue;
}
if (ch == '~') {
sp = ReadStack(sp, inf1);
sp = AddStack(sp, -inf1);
continue;
}
if (ch == '#') {
sp = ReadStack(sp, inf1);
sp = AddStack(sp, inf1);
continue;
}
if (ch == '!') {
sp = ReadStack(sp, inf1);
double fact = 1;
for(int k = 1; k <= (int)inf1; k++) {
fact *= k;
}
sp = AddStack(sp, fact);
continue;
}
sp = ReadStack(sp, inf2);
sp = ReadStack(sp, inf1);
switch (ch)
{
case '+': sp = AddStack(sp, inf1 + inf2); break;
case '-': sp = AddStack(sp, inf1 - inf2); break;
case '*': sp = AddStack(sp, inf1 * inf2); break;
case '/': sp = AddStack(sp, inf1 / inf2); break;
case '^': sp = AddStack(sp, pow(inf1, inf2)); break;
}
}
sp = ReadStack(sp, inf);
return inf;
}
int main()
{
cout << "Vvedite a" << endl; cin >> masz[int('a')];
cout << "Vvedite b" << endl; cin >> masz[int('b')];
cout << "Vvedite viragenie (naprimer: 2^3! ili +a^(-b))" << endl;
cin >> str;
AddPostFix(str, strp);
cout << "OPZ: " << strp << endl;
double s = rasAV(strp, masz);
cout << "Res=" << s << endl;
return 0;
}