C++实现中缀表达式转后缀表达式并计算结果

C++实现中缀表达式转后缀表达式并计算结果

思路:

1.中缀转后缀
创建一个字符串存储后缀表达式,一个栈存储运算符
遍历中缀表达式,遇到运算符进栈,遇到数字直接添加到字符串中
进栈时,若当前运算符优先级比栈顶高,直接进栈,否则将栈顶元素添加到字符串中并退栈,直到遇见优先级低的运算符,若栈顶为‘(’,直接进栈,若当前运算符为‘)’,将栈顶元素添加到字符串中并退栈至‘(’【注意:此时‘(’ 不进入字符串但依旧需要将‘(’ 退栈】。

最后将栈中所有运算符依次添加到字符串中,清空栈,此时字符串即为后缀表达式

2.后缀计算结果

创建一个栈存储数字

遍历后缀表达式,遇到数字进栈,遇到运算符出栈两次,将这两个数字根据响应的运算符进行计算,将计算结果进栈。

最后栈中存下的数字即为结果。

源代码:
#include<bits/stdc++.h>
#include<stack>
using namespace std;
int cuo(char[]);
void _cuo(int a);
void systems(void);
int level(char ch) //计算各个运算符优先级
{
    switch (ch)
    {
    case '+':
        return 1;
    case '-':
        return 1;
    case '*':
        return 2;
    case '/':
        return 2;
    case '^':
       	return 2;
    default:
        return 0;
    }
}

string InToPost(string str) //中缀转后缀
{
    stack<char> temp; //用于存储运算符的临时栈
    string back = ""; //用于存储后缀表达式
    for (int i = 0; i < str.length(); i++)
    {
        switch (str[i])
        {
        case '(': //若为'(',直接进栈
            temp.push('(');
            break;
        case ')': //若为')',出栈至'('
            while (!temp.empty() && temp.top() != '(')
            {
                back += temp.top();
                temp.pop();
            }
            temp.pop();
            break;
        default:
            if (str[i] >= '0' && str[i] <= '9') //若为数字,直接进字符串
            {
                if (str[i + 1] < '0' || str[i + 1] > '9')
                {
                    back += str[i];
                back += '#'; //数字结束后加#用以区分
                    
                }
                else
                {
                    back += str[i];
                }
             }
            else if (temp.empty() || temp.top() == '(' || (temp.top() != '(' && level(str[i]) > level(temp.top()))) //若为运算符,且比栈顶运算符优先级高,则直接进栈
            {
                temp.push(str[i]);
            }
            else    //否则出栈至遇到低优先级的运算符
            {
                while (!temp.empty() && level(str[i]) <= level(temp.top()))
                {
                    back += temp.top();
                    temp.pop();
                }
                temp.push(str[i]);
            }
            break;
        }
    }
    while (!temp.empty()) //将剩余的运算符出栈
    {
        back += temp.top();
        temp.pop();
    }
    return back;
}

double Result(string back) //利用后缀表达式计算结果
{
    double tempNum, num1, num2;
    stack<double> tempStack; //用于存储数字的临时栈
    for (int i = 0; i < back.length(); i++)
    {
        string tempStr = ""; //用于string转double的临时字符串
        if (back[i] >= '0' && back[i] <= '9')
        {
            while (back[i] != '#')
            {
                tempStr += back[i];
                i++;
            }
            tempNum = stod(tempStr);//string转double
            tempStack.push(tempNum);//转换后入栈
        }
        else if (back[i] != '#')//遇到运算符后出栈两次,用num1和num2分别暂时存储
        {
            num1 = tempStack.top();
            tempStack.pop();
            num2 = tempStack.top();
            tempStack.pop();
        }
        switch (back[i]) //遇到运算符就对num1和num2进行相应运算,用tempNum存储计算结果,并入栈
        {
        case '+':
            tempNum = num2 + num1;
            tempStack.push(tempNum);
            break;
        case '-':
           tempNum = num2 - num1;
            tempStack.push(tempNum);
            break;
        case '*':
            tempNum = num2 * num1;
            tempStack.push(tempNum);
            break;
        case '/':
            tempNum = num2 / num1;
            tempStack.push(tempNum);
            break;
        case '^':
            tempNum = pow(num2,num1);
            tempStack.push(tempNum);
            break;            

        }

    }

    return tempStack.top();

}


int main()
{
	XunHuan:
    char str[100];
    gets(str);
    string back = InToPost(str);
    cout<<back<< endl;
    double r = Result(back);
    cout<< "<< r;
    goto XunHuan;
    return 0;
}

拜拜

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现中缀表达式转后缀表达式和前缀表达式的图形化界面,需要使用一些第三方库来实现界面设计和用户交互。下面以Qt为例,给出一个简单的实现过程: 1. 创建一个Qt项目并添加一个主窗口,用于显示图形界面。 2. 在主窗口上添加一些控件,如文本框、按钮等,用于输入中缀表达式、显示后缀表达式和前缀表达式等。 3. 在按钮的点击事件中编写代码实现中缀表达式转后缀表达式和前缀表达式的功能。可以使用栈来实现转换过程。 4. 将转换后的后缀表达式和前缀表达式显示在相应的文本框中。 下面是一个简单的示例代码,用于实现中缀表达式转后缀表达式和前缀表达式的图形化界面: ```cpp #include <QMainWindow> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QHBoxLayout> #include <QStack> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建控件 infixEdit = new QLineEdit(this); postfixLabel = new QLabel(this); prefixLabel = new QLabel(this); convertBtn = new QPushButton("转换", this); // 创建布局 QHBoxLayout *layout = new QHBoxLayout(); layout->addWidget(infixEdit); layout->addWidget(convertBtn); layout->addWidget(postfixLabel); layout->addWidget(prefixLabel); // 创建中缀表达式转后缀表达式和前缀表达式的连接 connect(convertBtn, &QPushButton::clicked, this, &MainWindow::convert); // 设置布局 QWidget *widget = new QWidget(this); widget->setLayout(layout); setCentralWidget(widget); } public slots: void convert() { QString infix = infixEdit->text(); QString postfix = infixToPostfix(infix); QString prefix = infixToPrefix(infix); postfixLabel->setText(postfix); prefixLabel->setText(prefix); } private: QLineEdit *infixEdit; QLabel *postfixLabel; QLabel *prefixLabel; QPushButton *convertBtn; QString infixToPostfix(const QString &infix) { QStack<QChar> stack; QString postfix; for (int i = 0; i < infix.length(); i++) { QChar ch = infix[i]; if (ch.isDigit() || ch.isLetter()) { postfix += ch; } else if (ch == '(') { stack.push(ch); } else if (ch == ')') { while (!stack.isEmpty() && stack.top() != '(') { postfix += stack.pop(); } if (!stack.isEmpty() && stack.top() == '(') { stack.pop(); } } else { while (!stack.isEmpty() && precedence(stack.top()) >= precedence(ch)) { postfix += stack.pop(); } stack.push(ch); } } while (!stack.isEmpty()) { postfix += stack.pop(); } return postfix; } QString infixToPrefix(const QString &infix) { QString reversed = reverse(infix); QString postfix = infixToPostfix(reversed); QString prefix = reverse(postfix); return prefix; } int precedence(QChar op) { if (op == '+' || op == '-') { return 1; } else if (op == '*' || op == '/') { return 2; } return 0; } QString reverse(const QString &str) { QString reversed; for (int i = str.length() - 1; i >= 0; i--) { reversed += str[i]; } return reversed; } }; ``` 在上面的代码中,我们创建了一个MainWindow类,并在其中添加了一个用于输入中缀表达式的文本框、一个用于显示后缀表达式的标签、一个用于显示前缀表达式的标签和一个用于转换的按钮。在按钮的点击事件中,我们调用了infixToPostfix()和infixToPrefix()函数,分别实现中缀表达式转后缀表达式和前缀表达式的功能。其中,infixToPostfix()函数使用了栈来实现转换过程,infixToPrefix()函数则先将中缀表达式翻转,再调用infixToPostfix()函数,最后再将结果翻转回去得到前缀表达式。 这样,我们就实现了一个简单的中缀表达式转后缀表达式和前缀表达式的图形化界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值