Вычислить значение произвольного выражения, представленного в обратной польской записи - C (СИ) (73634)
Формулировка задачи:
Здравствуйте. Помогите с прогой пожалуйста.
Дано арифметическое выражение длиной до 30 символов, заканчивающееся знаком равенства. Выражение содержит знаки операции +, -, *, / и представлено в обратной польской записи. Если это операнд, то записать его в стек; если это операция, то извлечь два элемента из стека, выполнить математическую операцию и занести результат в стек. Вычислить значение выражения, используя стек операндов. Язык программирования С++. Помогите пожалуйста
Пример: 345+2*63/-+ = 19
Прогу сделал, но почему-то выводит не тот результат.
Проверьте, пожалуйста. Но мне надо, чтобы числа были максимум 4-значные и массив строки был динамический. Спасибо, заранее
#include <stdio.h>
#include <iostream>
using namespace std;
int Chislo ( char text [], int *i )
{
int c = 0;
while ( text [*i] >= '0' && text [*i] <= '9999' )
{
c = c * 10000 + ( text [*i] - '0' );
(*i)++;
}
return c;
}
int main()
{
char text [80];
int i;
float opd [3];
char opc [3];
int pr [3];
int j = -1;
cout << "Vvedite verazenie: ";
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];
}
opd [j-1] = opc [j];
pr [j-1] = pr [j];
j = j-1;
}
}
while ( text [i] != ' ');
cout << "Rezultat: " << opd [0] << endl;
system ( "pause" );
return 0;
}Решение задачи: «Вычислить значение произвольного выражения, представленного в обратной польской записи»
textual
Листинг программы
#include <cstdio>
int main() {
bool run = true;
char op[666];
double stack[666];
int top = -1;
while (run) {
scanf("%s", op);
double val;
if (sscanf(op, "%lf", &val) == 1) {
stack[++top] = val;
} else {
val = stack[top--];
if (op[1] == '\0') {
switch (op[0]) {
case '+':
stack[top] += val;
break;
case '-':
stack[top] -= val;
break;
case '*':
stack[top] *= val;
break;
case '/':
stack[top] /= val;
break;
case '=':
printf("%f\n", val);
run = false;
break;
default:
printf("error\n");
run = false;
break;
}
} else {
printf("error\n");
run = false;
}
}
}
}