Smart Recent Blog Post List

Sep 10, 2011

Post a Suggestion/Query

Open post for adding suggestions/queries to be considered for next posting.


Queries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and SuggestionsQueries and Suggestions





2 comments:

Latest problem. Need to convert the following code from a taking an infix expression and converting to a postfix, to code that takes postfix and converts it to infix. It should be simple but again, my great teacher ha given no notes on what does what. Heres the code;




#include
#include
#include

using namespace std;


void Convert(const string & Infix, string & Postfix);

bool IsOperand(char ch);

bool TakesPrecedence(char OperatorA, char OperatorB);


int main(void)
{
char Reply;

do
{
string Infix, Postfix; // local to this loop

cout << "Enter an infix expression (e.g. (a+b)/c^2, with no spaces):"
<< endl;
cin >> Infix;

Convert(Infix, Postfix);
cout << "The equivalent postfix expression is:" << endl
<< Postfix << endl;
cout << endl << "Do another (y/n)? ";
cin >> Reply;
}
while (tolower(Reply) == 'y');

return 0;
}


/* Given: ch A character.
Task: To determine whether ch represents an operand (here understood
to be a single letter or digit).
Return: In the function name: true, if ch is an operand, false otherwise.
*/
bool IsOperand(char ch)
{
if (((ch >= 'a') && (ch <= 'z')) ||
((ch >= 'A') && (ch <= 'Z')) ||
((ch >= '0') && (ch <= '9')))
return true;
else
return false;
}


/* Given: OperatorA A character representing an operator or parenthesis.
OperatorB A character representing an operator or parenthesis.
Task: To determine whether OperatorA takes precedence over OperatorB.
Return: In the function name: true, if OperatorA takes precedence over
OperatorB.
*/
bool TakesPrecedence(char OperatorA, char OperatorB)
{
if (OperatorA == '(')
return false;
else if (OperatorB == '(')
return false;
else if (OperatorB == ')')
return true;
else if ((OperatorA == '^') && (OperatorB == '^'))
return false;
else if (OperatorA == '^')
return true;
else if (OperatorB == '^')
return false;
else if ((OperatorA == '*') || (OperatorA == '/'))
return true;
else if ((OperatorB == '*') || (OperatorB == '/'))
return false;
else
return true;

}


/* Given: Infix A string representing an infix expression (no spaces).
Task: To find the postfix equivalent of this expression.
Return: Postfix A string holding this postfix equivalent.
*/
void Convert(const string & Infix, string & Postfix)
{
stack OperatorStack;
char TopSymbol, Symbol;
int k;

for (k = 0; k < Infix.size(); k++)
{
Symbol = Infix[k];
if (IsOperand(Symbol))
Postfix = Postfix + Symbol;
else
{
while ((! OperatorStack.empty()) &&
(TakesPrecedence(OperatorStack.top(), Symbol)))
{
TopSymbol = OperatorStack.top();
OperatorStack.pop();
Postfix = Postfix + TopSymbol;
}
if ((! OperatorStack.empty()) && (Symbol == ')'))
OperatorStack.pop(); // discard matching (
else
OperatorStack.push(Symbol);
}
}

while (! OperatorStack.empty())
{
TopSymbol = OperatorStack.top();
OperatorStack.pop();
Postfix = Postfix + TopSymbol;
}
}

Postfix to infix will not give you exact expression in terms of paranthesis, though it will give you same result on evaluation.

e.g. (a+b+c)*2
Postfix will be :- ab+c+2*
And postfix to infix will give :- (((a+b)+c)*2)

Algorithm for it:-
Define one operand stack.

Read expression left-to-right.
step#1 If it is an operand push it on stack.
step#2 If it is an operator then
a) pop two value from stack and insert operator in them.
c) put them in parenthesis () too

perform above step for all the symbol in expression from left-to-right order.

Post a Comment

Smart Recent Blog Post List