БлогNot. Инфиксная, префиксная и постфиксная формы записи выражений

Инфиксная, префиксная и постфиксная формы записи выражений

Для записи выражений при их программном оценивании часто используются не только привычная нам запись вида (A+B)/(C*D)-E/F, называемая инфиксной, но и постфиксная (была у меня когда-то в МК-61), и префиксная формы записи выражений.

Ниже показан простой конвертер выражения, записанного в постфиксной форме, в префиксную и инфиксную формы. Предполагается, что выражение в постфиксной форме корректно и состоит только их однобуквенных латинских операндов (переменных) A..Z и 4 знаков арифметических действий.

Для работы применяется стандартный стек, программка проверена в консоли Visual Studio 2015, на примере из "Вики" сработала :)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stack>
#include <string>
using namespace std;

bool isOperand(char x) { //Да, если буква (операнд)
 return (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z');
}

bool isOperator(char x) { //Да, если разрешённый оператор (арифметическое действие)
 switch (x) {
 case '+': case '-': case '/': case '*':  return true;
 }
 return false;
}

string getInfixFromPostfix(string exp) { //Получить инфиксную запись по постфиксной
 stack <string> s;
 for (int i = 0; exp[i] != '\0'; i++) {
  if (isOperand(exp[i])) { //Операнды - в стек
   string op(1, exp[i]);
   s.push(op);
  }
  else {
   string op1 = s.top();
   s.pop();
   string op2 = s.top();
   s.pop();
   s.push("(" + op2 + exp[i] + op1 + ")");
  }
 }
 return s.top(); //В стеке должен остаться 1 элемент, содержащий инфиксную запись
}

string getPrefixFromPostfix(string post_exp) { //Получить префиксную запись по постфиксной
 stack <string> s;
 size_t length = post_exp.size();
 for (size_t i = 0; i < length; i++) {
  if (isOperator(post_exp[i])) {
   string op1 = s.top();
   s.pop();
   string op2 = s.top();
   s.pop();
   string temp = post_exp[i] + op2 + op1;
   s.push(temp);
  }
  else {
   s.push(string(1, post_exp[i]));
  }
 }
 string ans = "";
 while (!s.empty()) {
  ans += s.top();
  s.pop();
 }
 return ans;
}

int main() {
 string exp = "CDB*AE-B^/+";
 //Предполагаем, что постфиксная запись корректна и нет лишних пробелов в строке!
 cout << endl << "Postfix:" << exp;
 cout << endl << "Prefix:" << getPrefixFromPostfix(exp);
 cout << endl << "Infix:" << getInfixFromPostfix(exp);
 cin.get(); return 0;
}

28.02.2018, 14:19 [5118 просмотров]


теги: c++ числа алгоритм математика

показать комментарии (2)