Перевод в обратную польскую запись
Проблема в отображении символов(знак + - * /)
#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int pror(char c){
int p;
switch (c)
{
case '(':
p = 0;
case ')':
p = 1;
case '+':
case '-':
p = 5;
break;
case '*':
case '/':
p = 4;
break;
case '^':
p = 2;
break;
default:
break;
}
return p;
}
class stackSTR {
private:
int size, top;
char a[100];
public:
stackSTR() { top = 0; }
void push(char var) {
a[++top] = var;
}
char pop() {
return a[top--];
}
char see() {
return a[top];
}
};
int main(){
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
stackSTR stk;
cout << "Enter your ... " << endl;
string q, w, tmp;
cin >> q;
for (int i = 0; i < q.length(); i++) {
if (!isdigit(q[i])) {
if (stk.see()==0) {
stk.push(q[i]);
}
else if((pror(q[i])>=stk.see())) {
if (q[i] == ')') {
while (stk.pop() != '(') {
w += stk.pop();
}
stk.pop();
}
else {
stk.push(q[i]);
}
}
else {
while (stk.pop() != 0) {
w += stk.pop();
}
}
}
else {
w += q[i];
cout << w << endl;
}
}
cout << w << endl;
return 0;
}
Ответы (1 шт):
Автор решения: KoVadim
→ Ссылка
Код реализован почти правильно. Но некоторые вещи написаны "неаккуратно". К примеру, нет функции проверки того, что стек пуст (для этого почему то проверяют, что в стеке ноль, а его туда никто не ставил специально). Также, в самом конце нужно извлечь из стека все, что там осталось, иначе выражения вида 1+2+3 будут неверными. И последнее - в стеке сравниваются приоритеты. А у Вас приоритет текущего и символ. Тоже очень странно. Вот минимально поправленный код, похоже, что он работает нормально (я пробовал на нескольких примерах)
#include <iostream>
#include <string>
int pror(char c){
int p;
switch (c)
{
case '(':
p = 0;
case ')':
p = 1;
case '+':
case '-':
p = 5;
break;
case '*':
case '/':
p = 4;
break;
case '^':
p = 2;
break;
default:
break;
}
return p;
}
class stackSTR {
private:
int size, top;
char a[100];
public:
stackSTR() { top = 0; }
void push(char var) {
a[++top] = var;
}
char pop() {
return a[top--];
}
char see() {
return a[top];
}
bool empty() { return top == 0;}
};
int main(){
stackSTR stk;
std::cout << "Enter your ... " << std::endl;
std::string q, w, tmp;
std::cin >> q;
for (int i = 0; i < q.length(); i++) {
std::cout << q[i] << "\n";
if (!isdigit(q[i])) {
if (stk.empty()) {
stk.push(q[i]);
}
else if((pror(q[i])>=pror(stk.see()))) {
if (q[i] == ')') {
while (stk.pop() != '(') {
w += stk.pop();
}
stk.pop();
}
else {
stk.push(q[i]);
}
}
else {
while (!stk.empty()) {
w += stk.pop();
}
stk.push(q[i]);
}
}
else {
w += q[i];
std::cout << w << std::endl;
}
}
while(!stk.empty()) {
w += stk.pop();
}
std::cout << w << std::endl;
return 0;
}
дальше самостоятельно