Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

I have some code that uses a stack to convert from infix to postfix. what I want is to be able to check for errors

I have some code that uses a stack to convert from infix to postfix. what I want is to be able to check for errors and evaluate the postfix expression.

the errors to watch out for are:

I want the program to notice the errors and print out a string to stop the program for each error

  1. If input symbol is "(", push it into stack.
  1. If input operator is "+", "-", "*", or "/", repeatedly print the top of the stack to the output and pop the stack until the stack is either (i) empty ; (ii) a "(" is at the top of the stack; or (iii) a lower-precedence operator is at the top of the stack. Then push the input operator into the stack.
  1. If input operator is ")" and the last input processed was an operator, report an error. Otherwise, repeatedly print the top of the stack to the output and pop the stack until a "(" is at the top of the stack. Then pop the stack discarding the parenthesis. If the stack is emptied without a "(" being found, report error.
  1. If end of input is reached and the last input processed was an operator or "(", report an error. Otherwise print the top of the stack to the output and pop the stack until the stack is empty. If an "(" is found in the stack during this process, report error.

#include

#include

#include

using namespace std;

//Function to return precedence of operators

int prec(char c)

{

if(c == '^')

return 3;

else if(c == '*' || c == '/')

return 2;

else if(c == '+' || c == '-')

return 1;

else

return -1;

}

// The main function to convert infix expression

//to postfix expression

void infixToPostfix(string s)

{

std::stack st;

st.push('N');

int l = s.length();

string ns;

for(int i = 0; i < l; i++)

{

// If the scanned character is an operand, add it to output string.

if((s[i] >= 'a' && s[i] <= 'z')||(s[i] >= 'A' && s[i] <= 'Z'))

ns+=s[i];

// If the scanned character is an (, push it to the stack.

else if(s[i] == '(')

st.push('(');

// If the scanned character is an ), pop and to output string from the stack

// until an ( is encountered.

else if(s[i] == ')')

{

while(st.top() != 'N' && st.top() != '(')

{

char c = st.top();

st.pop();

ns += c;

}

if(st.top() == '(')

{

char c = st.top();

st.pop();

}

}

//If an operator is scanned

else{

while(st.top() != 'N' && prec(s[i]) <= prec(st.top()))

{

char c = st.top();

st.pop();

ns += c;

}

st.push(s[i]);

}

}

//Pop all the remaining elements from the stack

while(st.top() != 'N')

{

char c = st.top();

st.pop();

ns += c;

}

cout << ns << endl;

}

//Driver program to test above functions

int main()

{

string exp = "a+b*(c^d-e)^(f+g*h)-i";

infixToPostfix(exp);

return 0;

}

// This code is contributed by Gautam Singh

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image_2

Step: 3

blur-text-image_3

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Database 101

Authors: Guy Kawasaki

1st Edition

0938151525, 978-0938151524

More Books

Students also viewed these Databases questions