Untitled
4 years ago in Plain Text
#include <iostream>
#include <string>
using namespace std;
void calculating(char* OPZ, int len)
{
string answer;
float stack[100];
//индекс ячейки, куда будет push-иться очередное число
int sp = 0; //индекс ячейки, являющейся вершиной стека
for (int j = 0; j <= len; j++) {
char c = OPZ[j];
if (c == 'x')
break;
else if (c == ' ' || c == '\n' || c == NULL)
continue;
else if (c == '+') {
stack[sp - 2] = stack[sp - 2 ] + stack[sp - 1];
sp--;
continue;
}
else if (c == '-') {
stack[sp - 2] = stack[sp - 2] - stack[sp - 1];
sp--;
continue;
}
else if (c == '*') {
stack[sp - 2] = stack[sp - 1] * stack[sp - 2];
sp--;
continue;
}
else if (c == '/') {
stack[sp - 2] = stack[sp - 2] / stack[sp - 1];
sp--;
continue;
}
else {
for (int y = j; y < len; y++) { //просматриваем текущую строку начиная j
if (isdigit(OPZ[y]) || OPZ[y] == ',') {//если элемент строки число или запятая
answer += OPZ[y]; //вносим элемент строки в выходную строку
}
else {
j = y; //иначе заканчиваем просмотр строки
break;
}
}
stack[sp] = stof(answer); //в стэк ответов заносим нашу выходную строку переведённую в тип float
sp++;
answer.clear(); // очищаем выходную строку
}
}
cout << endl;
cout << "Результат= " << stack[sp - 1] << endl;
}
void main(void)
{
setlocale(LC_ALL, "Rus");
int i = 0, s = 0, e = 0;
char vr[100], stack[100], exit[100];
cin >> vr;
for (i = 0; vr[i] != '\0'; i++)
switch (vr[i])
{
case '+':
while ((s != 0) && (stack[s - 1] != '('))
{
exit[e] = stack[s - 1]; //на выход
e++;
s--;
}
stack[s] = '+'; //в стек
s++;
break;
case '-':
while ((s != 0) && (stack[s - 1] != '('))
{
exit[e] = stack[s - 1];
e++;
s--;
}
stack[s] = '-';
s++;
break;
case '*':
while ((s != 0) && (stack[s - 1] != '(') && (stack[s - 1] != '+') && (stack[s - 1] != '-'))
{
exit[e] = stack[s - 1];
e++;
s--;
}
stack[s] = '*';
s++;
break;
case '/':
while ((s != 0) && (stack[s - 1] != '(') && (stack[s - 1] != '+') && (stack[s - 1] != '-'))
{
exit[e] = stack[s - 1];
e++;
s--;
}
stack[s] = '/';
s++;
break;
case '(':
{
stack[s] = '(';
s++;
break; }
case ')':
while ((stack[s - 1] != '(') && (s != 0))
{
exit[e] = stack[s - 1];
e++;
s--;
}
stack[s - 1] = ' ';
s--;
break;
default:
{
exit[e] = vr[i];
e++;
if ((vr[i + 1] == '+') ||
(vr[i + 1] == '-') ||
(vr[i + 1] == '*') ||
(vr[i + 1] == '/') ||
(vr[i + 1] == '(') ||
(vr[i + 1] == ')'))
{
exit[e] = ' ';
e++;
}
}
}
exit[e] = ' ';
e++;
while (s != 0)
{
exit[e] = stack[s - 1];
e++;
s--;
}
cout << "В обратной польской записи: ";
exit[e] = 'x';
for (i = 0; i < e; i++)
{
cout << exit[i];
}
calculating(exit, i); // считаем
}