Question

In: Computer Science

Write a program to check given expression is valid or not.The expression consists of paranthsis like  [{(...

Write a program to check given expression is valid or not.The expression consists of paranthsis like  [{( if valid then convert into postfix expression and after conversion then evaluate postfix expession(using stack) and do not use build in stack. Use the c++ laguage.

Solutions

Expert Solution

#include<iostream>
#include<stack>
#include<string>

using namespace std;

// Function to convert Infix expression to postfix
string InfixToPostfix(string expression);

// Function to verify whether an operator has higher precedence over other
int HasHigherPrecedence(char operator1, char operator2);

// Function to verify whether a character is operator symbol or not.
bool IsOperator(char C);

// Function to verify whether a character is alphanumeric chanaracter
//(letter or numeric digit) or not.
bool IsOperand(char C);

// Function to check whether a char is an opening parenthesis i.e '(' or '{' or '['
bool IsOpeningParentheses(char C);

// Function to check whether a char is an closing parenthesis i.e ')' or '}' or ']'
bool IsClosingParentheses(char C);

int main()
{
        string expression;
        cout<<"Enter Infix Expression \n";
        getline(cin,expression);
        string postfix = InfixToPostfix(expression);
        cout<<"Output = "<<postfix<<"\n";
}

// Function to evaluate Postfix expression and return output
string InfixToPostfix(string expression)
{
        // Declaring a Stack from Standard template library in C++.
        stack<char> S;
        string postfix = ""; // Initialize postfix as empty string.
        for(int i = 0;i< expression.length();i++) {

                // Scanning each character from left.
                // If character is a delimiter, move on.
                if(expression[i] == ' ' || expression[i] == ',') continue;

                // Else if character is an operand then just append it in res string
                else if(IsOperand(expression[i]))
                {
                        postfix +=expression[i];
                }

                //If character is operator, check for Higher precedence operator in Stack top
                //till first opening bracket and pop all such operators
                //Finally push the current operator on the Stack
                else if(IsOperator(expression[i]))
                {
                        while(!S.empty() && !IsOpeningParentheses(S.top())
                        && HasHigherPrecedence(S.top(),expression[i]))
                        {
                                postfix+= S.top();
                                S.pop();
                        }
                        S.push(expression[i]);
                }

                //If opening Parentheses simply push it on the Stack
                else if(IsOpeningParentheses(expression[i]))
                {
                        S.push(expression[i]);
                }

        //If Closing Parentheses then pop all the operators and append to res string
        // until Stack top is opening Parentheses and finally one extra pop for Opening Parentheses
                else if(IsClosingParentheses(expression[i]))
                {
                        while(!S.empty() && !IsOpeningParentheses(S.top())) {
                                postfix += S.top();
                                S.pop();
                        }
                        S.pop();
                }
        }

    //Finally pop and append all operators till Stack is not empty
        while(!S.empty()) {
                postfix += S.top();
                S.pop();
        }

        return postfix;
}

// Function to verify whether a character is english letter or numeric digit.
// We are assuming in this solution that operand will be a single character
bool IsOperand(char C)
{
        if(C >= '0' && C <= '9') return true;
        if(C >= 'a' && C <= 'z') return true;
        if(C >= 'A' && C <= 'Z') return true;
        return false;
}

// Function to verify whether a character is operator symbol or not.
bool IsOperator(char C)
{
        if(C == '+' || C == '-' || C == '*' || C == '/' || C== '^')
                return true;

        return false;
}

bool IsOpeningParentheses(char C)
{
    if(C == '(' || C == '{' || C=='[')
        return true ;
    return false;
}

bool IsClosingParentheses(char C)
{
    if(C == ')' || C == '}' || C==']')
        return true ;
    return false;
}
// Function to verify whether an operator is right associative or not.
int IsRightAssociative(char op)
{
        if(op == '^') return true;
        return false;
}

// Function to get weight of an operator. An operator with higher weight will have higher precedence.
int GetOperatorWeight(char op)
{
        int weight = -1;
        switch(op)
        {
        case '+':
        case '-':
                weight = 1;
                break ;
        case '*':
        case '/':
                weight = 2;
                break ;
        case '^':
                weight = 3;
                break;
        }
        return weight;
}

// Function to perform an operation and return output.
int HasHigherPrecedence(char op1, char op2)
{
        int op1Weight = GetOperatorWeight(op1);
        int op2Weight = GetOperatorWeight(op2);

        // If operators have equal precedence, return true if they are left associative.
        // return false, if right associative.
        // if operator is left-associative, left one should be given priority.
        if(op1Weight == op2Weight)
        {
                if(IsRightAssociative(op1)) return false;
                else return true;
        }
        return op1Weight > op2Weight ?  true: false;
}

Note: I hope the above source code will help you with your question and this is what you wanted. If in case you find any error or wrong implementation then please do let me know through comments. I'll try to resolve your issue and post the updated source code as you want in the comments section. Thank You!!!!1

ThumbsUP!!!Have a Nice Day....


Related Solutions

Write a program (preferably in Java) that, given an arithmetic expression, first transforms it to a...
Write a program (preferably in Java) that, given an arithmetic expression, first transforms it to a postfix form, and then computes its value (by using stack-based algorithms). Assume that all the numbers in the arithmetic expression are one-digit numbers, i.e., each of these numbers is either 0, or 1, or 2, ..., or 9. For example, your program should correctly process expressions like 2+3*4, but there is no need to process expressions like 11+22.
In Java, write class InfixToPostfixConverter co convert an ordinary infix arithmetic expression (assume a valid expression...
In Java, write class InfixToPostfixConverter co convert an ordinary infix arithmetic expression (assume a valid expression is entered) with single-digit integers (to make things easier) such as (6 + 2) • 5 - 8 / 4 to a postfix expression. The postfix version (no parentheses are needed) of this infix expression is 6 2 + 5 * 8 4 / - The program should read the expression into StringBuilder or String infix and use the Stack and Stack Interface class...
C Programming Question: Q) Write a C - program to check whether a given graph is...
C Programming Question: Q) Write a C - program to check whether a given graph is Bipartite using Breadth-first search (adjacency list) Do take your time but please do post full code and also please do it in C.
Using python: Given a string x, write a program to check if its first character is...
Using python: Given a string x, write a program to check if its first character is the same as its last character. If yes, the code should output "True"
•Write a JAVA program to check a given password strength from a user's input. •Create a...
•Write a JAVA program to check a given password strength from a user's input. •Create a method to check the number of characters. It must be more than 8. •Create a method to check the password to have at least one uppercase letter. •Create a method to check the password to have at least one lowercase letter. •Create a method to check the password to have at least one digit. •Create a method to check the password to have at...
Write a Java method to check whether a string is a valid password. Password rules: A...
Write a Java method to check whether a string is a valid password. Password rules: A password must have at least ten characters. A password consists of only letters and digits. A password must contain at least two digits. There are at least SIX functions/methods as the following: 1. menu() – to print the password’s rules. 2. getString() – to get the password from the user. 3. isPassword() – to check either the password is valid based on the given...
Scala: Write and test a program as elegantly as possible You are given a puzzle like...
Scala: Write and test a program as elegantly as possible You are given a puzzle like this: 7 __ 10 __ 2 Each blank may be filled with a ‘+’ (plus) or ‘-’ (minus), producing a value k. For all combinations of plus and minus, find the value of k that is closest to 0. In the above case, there are 4 combinations, each producing a different value: 7 + 10 + 2 = 19 7 + 10 - 2...
Write a program IN JAVA that asks the user for a number. The program should check...
Write a program IN JAVA that asks the user for a number. The program should check the number to ensure that it is valid (if not, the user should enter a valid number to continue.) The program should print out all of the prime numbers from 2 up to the number, with up to 10 numbers per line. (Recall: A prime number is a number that is only divisible by itself and 1.) The code should ask the user if...
Using Java 8. Write a program that reads an expression in postfix notation, builds the expression...
Using Java 8. Write a program that reads an expression in postfix notation, builds the expression tree and prints the expression in prefix and infix notation and evaluates the expression. (Hint use a stack)
Write the logical expression for the control signal RF_Write assuming the instruction set consists only of...
Write the logical expression for the control signal RF_Write assuming the instruction set consists only of the instructions below. The answer should be similar to "B_Select = T3 ∙ (Load + Store + AddImm + …) + …" Add R3,R4,R5 Load R5,X(R7) Store R6,X(R8) Unconditional Branch Conditional Branch (Branch_if_[R5]=[R6] Loop) Subroutine Call (Call_Register R9)
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT