当前位置: 首页 > 知识库问答 >
问题:

如何正确测试后缀表达式是否有效?

广昊昊
2023-03-14

以下是我所做的基本步骤:

  1. 要求用户输入表达式(存储为字符串)
  2. 遍历每个字符并确定该字符是操作数、运算符、空格还是无效字符
  3. 如果(char==操作数)推入堆栈
  4. 如果(char==operator)弹出两次并执行算术,然后将结果推送到堆栈
  5. 循环外,如果(!stack.empty())结果==stack.top,stack.pop
  6. 否则无效表达式

因此,如果堆栈已经是空的,上面的方法可以很好地工作,但是如果堆栈上有更多的操作数,结果就会简单地打印出来。这显然是不正确的,因为如果堆栈上仍有多个操作数,它应该是无效的表达式。

代码:

int main() 
{
    string expression;
    char response;
    int result = -1;        //result of expression. Initialized to -1
    Stack stack;

    printMenu();

    do {
        cout << "Would you like to enter an expression? (y / n)" << endl;
        cin >> response;
        response = toupper(response);

        switch(response) 
        {
            case 'Y':
                //needed due to new line
                cin.ignore();
                doWork(stack, expression, result);
                break;
            case 'N':
                cout << "Exiting program." << endl;
                break;
            default:
                cout << "Invalid response. Try again." << endl;
        }

    } while(response != 'N');

    return EXIT_SUCCESS;
}

doWork(别担心,它会被重命名)函数:

void doWork(Stack stack, string expression, int result)
{
    cout << "Enter a PostFix expression: ";
    getline(cin, expression);

    for(int i = 0; i < expression.size(); i++)
    {
        if(expression[i] == ' ') {
            //do nothing
        } else if(isInteger(expression[i])) {
           stack.push(convertChar2Int(expression[i]));
        } else if(isOperator(expression[i])) {
           // pop last 2 ints from stack and do arithmetic on them 
           int a = stack.top();
           stack.pop();
           int b = stack.top();
           stack.pop();
           // push result onto stack 
           stack.push(calculate(a, b, expression[i]));
        } else {
           //cerr : enter different expression
           cout << expression[i] << " is an invalid character." << endl;
        }
    }

    //the result should be the top of stack
    // THIS IS WHERE MY ISSUE IS
    if(!stack.empty()) {
        result = stack.top();
        stack.pop();
    } else {
        cout << "Invalid expression." << endl;
    }

    cout << "Result: " << result << endl;
}

共有1个答案

马德宇
2023-03-14

要验证表达式,需要测试多个条件。

  • 在表达式验证期间,堆栈永远不应为空。也就是说,在向任何运算符弹出参数时,不应该获得stack.empty()
  • 计算完表达式后,堆栈上应该正好有一个元素。您可以通过以下过程确定这一点(假设堆栈没有返回当前堆栈深度的方法):
    1. 首先检查堆栈是否为空。如果是:错误。
    2. 接下来,弹出堆栈顶部作为潜在结果。把它放在一边。
    3. 现在,再次检查堆栈是否为空。如果不为空:错误。
    4. 最后,如果您到达这里没有错误,则返回潜在的结果作为最终结果。

应该就行了。

 类似资料:
  • 我需要的算法,将检查是否给定的表达式是中缀,后缀或前缀表达式。我尝试了一种方法,通过检查字符串的第一个或最后两个项,例如。 AB如果字符串的第一个索引中有一个运算符,那么它就是一个前缀 AB如果字符串的最后一个索引中有一个运算符,那么它就是一个后缀 否则它就是一个中缀。 但是感觉不太合适,所以请建议我一个更好的算法。

  • 本文向大家介绍中缀表达式转后缀表达式相关面试题,主要包含被问及中缀表达式转后缀表达式时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 对于中缀表达式,遇到操作数直接将其输出,如果遇到操作符和左括号全部压入栈中,若遇到右括号则将栈中元素全部弹出,直到遇到左括号为止。压栈过程中,若遇到其它操作符,从栈中弹出元素直到遇到更低优先级的操作符为止。

  • 我有一个带两个可能输出的字符串,它将被<代码>

  • 当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊

  • 本文向大家介绍评估后缀表达式,包括了评估后缀表达式的使用技巧和注意事项,需要的朋友参考一下 为了求解数学表达式,我们需要前缀或后缀形式。将中缀转换为后缀后,我们需要后缀评估算法来找到正确的答案。 在这里,我们还必须使用堆栈数据结构来解决后缀表达式。 从后缀表达式中,找到一些操作数后,将它们压入堆栈。找到某个运算符后,将从堆栈中弹出两个项目,并按正确的顺序执行操作。之后,结果也被压入堆栈中以备将来使

  • 问题内容: 我有一个小程序,允许用户输入一些正则表达式。之后,我想检查此输入是否为 有效的 正则表达式。 我想知道Java中是否有内置方法,但是找不到这种喷射器。 你能给我一些建议吗? 问题答案: 这是一个例子。 然后输出,例如。