Моя проблема в том, что я не знаю, как получить что-нибудь для вывода отсюда. Я хочу напечатать результат постфикса до сих пор, используя printResult () .. как я могу это сделать? Я не уверен, как рассчитать результат, который я получаю внутри моей функции inToPost (), которая должна быть результатом преобразования в постфикс. Благодарю.
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
using namespace std;
class Expression{
public:
string inToPost();
string convertThis; // Expression that we want converted
Expression(string input, int direction); //constructor
bool isOperator(char character);
bool isOperand(char character);
int isHigherWeight(char character);
bool isHigherPrecedence(char op1, char op2);
string printResult();
private:
string infix;
string postfix;
string prefix;};
//Constructor function
Expression::Expression(string input, int direction){
switch (direction){
case 1: infix = input;
case 2: postfix = input;
case 3: prefix = input;
}
}
//Operator Function checks to see if character is a legal symbol
bool Expression::isOperator(char character){
if((character == '*')||(character == '+')||(character == '-')||(character == '/'))
return true;
else
return false;
}//Operand Function checks to see if character is a legal character
bool Expression::isOperand(char character){
if(character >= 'a' && character <= 'z')
return true;
if(character >= 'A' && character <= 'Z')
return true;
if(character >= '0' && character <= '9')
return true;
else
return false;
}
//Function determines the weight of Operator.
int Expression::isHigherWeight(char character){
int weight = 0; // or -1?
switch(character){
case '+':
case '-':
weight = 1;
case '*':
case '/':
weight = 2;
}
return weight;
}
//Function that compares weights of two different Operators.
bool Expression::isHigherPrecedence(char oper1, char oper2){
int op1Weight = isHigherWeight(oper1);
int op2Weight = isHigherWeight(oper2);
// If operators have equal precedence, return true
// return false
return op1Weight > op2Weight ? true: false;{
}
}
string Expression::inToPost(){
stack<char> Stack;
string postfix = ""; // Initialize postfix as empty string.
for(int i = 0;i< convertThis.length();i++){ //go through array of string convertThis
if (convertThis[i] == '('){ //1-Read the left parenthesis and push it onto the stack
Stack.push(convertThis[i]);
}else if(isOperand(convertThis[i])){ //2-else if( the next input is a number or letter)
cout << convertThis[i]; //3-Read the operand and write it to the output
}else if(isOperator(convertThis[i])){ //4-else if the next input is operator
cout << Stack.top();
Stack.pop(); //5-Print the top operation and pop it
}
//6-
while(!Stack.empty() && Stack.top() != '(' && isHigherPrecedence(Stack.top(),convertThis[i])){
Stack.push(convertThis[i]); //7- Read the next input symbol, and push this symbol onto the stack
}
// 8- Read and discard the next input symbol(which should be a right parenthesis).
if (convertThis[i] == ')'){
i+1;
// 9- Print the top operation and pop it; Keep printing and popping until
while (!Stack.top() == '('){
cout << Stack.top();
Stack.pop();
}
}
Stack.pop(); //10- Finally, pop the left parenthesis.
while(!Stack.empty()){
cout << Stack.top();
}return postfix;
}
}string Expression::printResult(){
return postfix;
}int main(){
string convertThis;int choice;cout << "|-----Here is my conversion menu-----|" << endl;
cout << "|----What are you converting to?-----|" << endl << endl;
cout << "1- Infix to postfix" << endl;
cout << "2- Infix to prefix" << endl;
cout << "3- postfix to infix?" << endl;
cout << "4- prefix to infix?" << endl;
//cin >> choice;
//cin.ignore();
cout << "Now enter the expression you want to convert ";
getline(cin,convertThis);
//Expression printResult;
//cout << printResult.printResult();}
Ваш вопрос слишком сложен, чтобы спрашивать: «Как отправить вывод на экран?» У вас есть 10 функций в классе … класс, который вы никогда не использовали в main
, Половина функций пуста … Начните с меньшего. Начните с класса, который имеет частный string
переменная, конструктор, который принимает string
и один public
функция для отображения этой строки.
Это будет выглядеть примерно так …
#include <string>
#include <iostream>
class MyClass{
public:
MyClass(std::string str) : m_string(str){}
void PrintString() { std::cout << m_string << std::endl; }
private:
std::string m_string;
};
int main(int argc, char * argv[]){
std::string inputString("This is my test string.");
MyClass myClass(inputString); // create an instance of your class
myClass.PrintString(); // Print the variable within your class
return 0;
}
Как только у вас будет эта работа, добавьте второй вход в конструктор для ваших 4 опций. Есть много способов сделать это. Затем одну за другой добавьте остальные функции и протестируйте их.
Других решений пока нет …