在dev中用C++写中缀表达式转为后缀表达式和前缀表达式的图形化页面并给代码加注释
时间: 2023-11-22 13:54:12 浏览: 172
这里提供一个基于Qt的图形化中缀表达式转为后缀表达式和前缀表达式的程序。以下是代码及注释:
```C++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <stack>
#include <string>
#include <iostream>
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->infixToPostfixBtn, SIGNAL(clicked()), this, SLOT(infixToPostfix()));
connect(ui->infixToPrefixBtn, SIGNAL(clicked()), this, SLOT(infixToPrefix()));
}
MainWindow::~MainWindow()
{
delete ui;
}
// 中缀表达式转后缀表达式
void MainWindow::infixToPostfix()
{
string infix = ui->infixLineEdit->text().toStdString();
stack<char> s; // 运算符栈
string postfix; // 后缀表达式
for (int i = 0; i < infix.size(); i++) {
if (isdigit(infix[i])) { // 如果是数字,直接加入后缀表达式
postfix += infix[i];
} else if (infix[i] == '(') { // 如果是左括号,入栈
s.push(infix[i]);
} else if (infix[i] == ')') { // 如果是右括号,弹出栈中所有运算符,加入后缀表达式
while (!s.empty() && s.top() != '(') {
postfix += s.top();
s.pop();
}
s.pop(); // 弹出左括号
} else { // 如果是运算符
while (!s.empty() && precedence(s.top()) >= precedence(infix[i])) { // 弹出栈中优先级不低于当前运算符的所有运算符
postfix += s.top();
s.pop();
}
s.push(infix[i]); // 当前运算符入栈
}
}
while (!s.empty()) { // 弹出栈中所有运算符,加入后缀表达式
postfix += s.top();
s.pop();
}
ui->postfixLineEdit->setText(QString::fromStdString(postfix));
}
// 中缀表达式转前缀表达式
void MainWindow::infixToPrefix()
{
string infix = ui->infixLineEdit->text().toStdString();
stack<char> s; // 运算符栈
string prefix; // 前缀表达式
reverse(infix.begin(), infix.end()); // 反转中缀表达式
for (int i = 0; i < infix.size(); i++) {
if (infix[i] == '(') { // 如果是左括号,入栈
infix[i] = ')';
} else if (infix[i] == ')') { // 如果是右括号,入栈
infix[i] = '(';
}
}
for (int i = 0; i < infix.size(); i++) {
if (isdigit(infix[i])) { // 如果是数字,直接加入前缀表达式
prefix += infix[i];
} else if (infix[i] == '(') { // 如果是左括号,入栈
s.push(infix[i]);
} else if (infix[i] == ')') { // 如果是右括号,弹出栈中所有运算符,加入前缀表达式
while (!s.empty() && s.top() != '(') {
prefix += s.top();
s.pop();
}
s.pop(); // 弹出左括号
} else { // 如果是运算符
while (!s.empty() && precedence(s.top()) > precedence(infix[i])) { // 弹出栈中优先级高于当前运算符的所有运算符
prefix += s.top();
s.pop();
}
s.push(infix[i]); // 当前运算符入栈
}
}
while (!s.empty()) { // 弹出栈中所有运算符,加入后缀表达式
prefix += s.top();
s.pop();
}
reverse(prefix.begin(), prefix.end()); // 反转前缀表达式
ui->prefixLineEdit->setText(QString::fromStdString(prefix));
}
// 获取运算符优先级
int MainWindow::precedence(char op)
{
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else if (op == '^') {
return 3;
} else {
return 0;
}
}
```
其中,`infixToPostfix()`函数实现中缀表达式转后缀表达式,`infixToPrefix()`函数实现中缀表达式转前缀表达式,`precedence()`函数获取运算符优先级。在界面中,`infixLineEdit`为输入中缀表达式的文本框,`postfixLineEdit`为输出后缀表达式的文本框,`prefixLineEdit`为输出前缀表达式的文本框,`infixToPostfixBtn`为中缀转后缀按钮,`infixToPrefixBtn`为中缀转前缀按钮。在构造函数中,通过`connect()`函数将按钮的点击事件与对应的转换函数连接起来。
阅读全文