从C ++中的后缀表达式字符串打印各个操作

问题描述 投票:2回答:1

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

我正在使用C ++编写一个评估后缀表达式的程序。将采用的表达式类型为中缀符号,并使用大写字母(A-Z)和以下四个操作:*,/,+和-。

例如:(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 +

CD-

AB + CD-*

实际输出:

AB +

CD-

«┤*

我不确定最后一行是怎么回事,但我认为这与我将字符推入堆栈的方式有关。

这里是另一个示例:

前缀表达式:(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 /

DE-

╢F*

GH-

&╝*

+

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

c++ expression reverse polish
1个回答
0
投票

程序中的错误来自s堆栈变量,使用类型char而不是类型string,这是存储多个字符所需的。

[将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;
}

© www.soinside.com 2019 - 2024. All rights reserved.