3

需要帮助分解后缀表达式并输出每个单独的操作。我的问题不是评估实际表达式,而是在评估之前打印每个单独的操作。

我正在使用 C++ 编写一个评估后缀表达式的程序。将采用的表达式类型为中缀表示法,并使用大写字母(AZ)和这四个操作:*、/、+ 和-。

例如:(A + B) * (F - G)

我编写了一个将中缀更改为后缀的函数:

AB+FG-*

现在我想编写一个输出每个单独操作的函数。对于上面的示例,它看起来像这样:

操作:

AB+

FG-

AB+FG-*

它需要按优先顺序输出操作。由于 A 和 B 在括号中,因此需要先完成它们,依此类推。我试图编写一个函数,该函数将后缀表达式作为输入并且不返回任何内容。该函数创建一个 char 类型的堆栈,并从头到尾遍历表达式。

如果字符是操作数,则将其压入堆栈。如果字符是运算符,则将堆栈的两个顶部值存储在 char 变量中,然后使用它们各自的运算符输出。

但是,我的函数似乎没有正确输出操作。

#include<iostream>
#include<stack>
#include <algorithm> 
#include <cstdlib>
#include<string>

void operations(string exprsn) {

char op1, op2;
int len, x, j = 0;
len = exprsn.length();
stack<char>s;
string ns;

for (int i = 0; i < len; i++) {

    if (exprsn[i] >= 'A' && exprsn[i] <= 'Z') {
        s.push(exprsn[i]);
    }

    else if (isOperator(exprsn[i])) {
        op1 = s.top();
        s.pop();
        op2 = s.top();
        s.pop();
        switch (exprsn[i]) {
        case '+':
            s.push(op2 + op1 + '+' );
            cout << op2 << op1 << "+\n";
            break;
        case '-':
            s.push(op2 + op1 + '-');
            cout << op2 << op1 << "-\n";
            break;
        case '*':
            s.push(op2 + op1 + '*');
            cout << op2 << op1 << "*\n";
            break;
        case '/':
            s.push(op2 + op1 + '/');
            cout << op2 << op1 << "/\n";
            break;
        }

        }


    }
}

int main(){
string s = "AB+CD-*";
operations(s);
return 0;
}

预期输出:

AB+

光盘-

AB+CD-*

实际输出:

AB+

光盘-

«┤*

我不确定最后一行发生了什么,但我认为这与我将字符推入堆栈的方式有关。

这是另一个例子:

中缀表达式: ( A + B ) / C + ( D - E ) * F * ( G - H )

转换为后缀表示法后:

AB+C/DE-F*GH-*+

预期输出:

AB+

DE-

GH-

DE-F*

GH-*

AB+C/

AB+C/DE-F*GH-*+

实际输出:

AB+

“C/

德-

╢F*

生长激素-

&╝*

+

我知道我在某个地方犯了可怕的错误,而且我很难理解。任何帮助是极大的赞赏。谢谢你。

4

1 回答 1

0

程序中的错误来自使用 type而不是 type的s堆栈变量,需要存储多个字符。charstring

op2 + op1 + '+'被压入堆栈时,+符号不会将字符op2op1'+'连接在一起,因为每个变量的所有数据类型都是字符。相反,这些+符号将每个字符的 ascii 数值相加,导致输出奇怪。

这是代码的固定版本:

void operations(string exprsn)
{

    string op1, op2;
    int len, x, j = 0;
    len = exprsn.length();
    stack<string> s;
    string ns;

    for (int i = 0; i < len; i++)
    {

        if (exprsn[i] >= 'A' && exprsn[i] <= 'Z')
        {
            s.push(string(1, exprsn[i]));
        }

        else if (isOperator(exprsn[i]))
        {
            op1 = s.top();
            s.pop();
            op2 = s.top();
            s.pop();
            switch (exprsn[i])
            {
            case '+':
                s.push(op2 + op1 + '+');
                cout << op2 << op1 << "+\n";
                break;
            case '-':
                s.push(op2 + op1 + '-');
                cout << op2 << op1 << "-\n";
                break;
            case '*':
                s.push(op2 + op1 + '*');
                cout << op2 << op1 << "*\n";
                break;
            case '/':
                s.push(op2 + op1 + '/');
                cout << op2 << op1 << "/\n";
                break;
            }
        }
    }
}

int main()
{
    string s = "AB+CD-*";
    operations(s);
    return 0;
}

于 2019-02-03T23:07:37.453 回答