Программа переводит выражение в обратную польскую запись и считает ее. Но вывод результата не правильный например(1+2 равно с). Что не провильно сделано?
Вот код:
Код:
#include "stdafx.h"
#include <iostream>
#include "string.h"
#include "ctype.h" //для isalnum
using namespace std;
char stack[50],opz[50],sp=0;
int prior(char ch) //определяет приоритет символа
{
switch (ch)
{
case '(': return 0;
case ')': return 1;
case '+': case '-': return 2;
case '*': case '/': return 3;
case ' ':return -2;
default: if (isalnum(ch))
return -1;
else return 99; //код ошибки (ошибочный символ)
}
}
int get_token()
{
static int i=0; //i-номер последнего запиханного в стек символа
char ch;
cin.get(ch); //сh-очередной считанный из вх. потока символ
if (ch=='\n') //если конец ввода то
{
if (stack[i]!=' ') //если стек не пуст
for(i;i>=0;i--)
opz[sp++]=stack[i]; //то выталкиваем все символы из стека
return 0; //0-код завершения обработки
}
switch (prior(ch)) //проверяет приоритет символа
{
case -1: { opz[sp++]=ch; return 1;} //если это цифра
case -2: return 1; //если пробел, пропускает его
case 99: return -1; //если ошибка, возвращает код ошибки
default: //если же это символ операции
if (ch==')') //если это закр. скобка
{
for (i; stack[i]!='('; i--) //выталкивает из стека все символы до (
{
opz[sp++]=stack[i];
stack[i]=' ';
}
stack[i--]=' '; //стирает (
}
else
if (ch!='(' && stack[i]!=' ' && prior(ch)<=prior(stack[i]))
{ //иначе если это не (, стек не пуст и приоритет выше, чем у предыд.
int fl=0;
for(i;fl==0 && i>=0;i--) //выталкивает символы из стека, пока не встретит символ с более выс. приоритетом
{
if (i!=0 && prior(stack[i-1])<prior(ch));
stack[i]=' ';
}
stack[++i]=ch; //записывает символ в стек
}
else
if (stack[i]!=' ') //иначе если стек не пуст
stack[++i]=ch; //записывает в стек и увеличивает i
else
stack[i]=ch; //если стек пуст, записывает без увеличения i
return 1;
}
}
void main()
{
setlocale(LC_CTYPE,"Russian");
int k,p=0;
for (k=0;k<50;k++)
stack[k]=' ';
cout << "Введите выражение:";
while (cin)
{
k=get_token(); //результат обработки очередного символа
if (k==0) //0-окнончание работы
break;
if (k==-1) //-1-ошибка
{
cout<<"\n Ошибка!";break;
}
else continue; //иначе продолжение
}
cout << opz << endl;
for (k=0;k<50;k++)
stack[k]=' ';
for (k=0;k<sp;k++)
{
if (prior(opz[k])==-1)
stack[p++]=opz[k];
else
{
switch (opz[k])
{
case '+':
{stack[p-2]=stack[p-2]+stack[p-1];
p--;
break;}
case '-':
{stack[p-2]=stack[p-2]-stack[p-1];
p--;
break;}
case '*':
{stack[p-2]=stack[p-2]*stack[p-1];
p--;
break;}
case '/':
{stack[p-2]=stack[p-2]/stack[p-1];
p--;
break;}
default:
{cout << "ERROR";break;}
}
}
}
cout << stack[p-1] << endl;
system("PAUSE");
}