QT算数表达式求值

来源:互联网 发布:适合家政的软件 编辑:程序博客网 时间:2024/05/23 16:41

对之前的那个QT做的计算器,做一个修改。

原版本链接

有兴趣的话,可以两者结合起来,通过这个改进的过程,找到问题,进一步的提升。

新版本代码:

#include "mainwindow.h"#include "ui_mainwindow.h"#include <stack>#include <QMessageBox>using namespace std;MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    ui->lineEdit->setFocus();}MainWindow::~MainWindow(){    delete ui;}void MainWindow::on_lineEdit_returnPressed(){    QString s = ui->lineEdit->text();    ui->lineEdit->clear();    if (s.isEmpty()){        return;    }    s = s.remove(" ");//remove the white space.    if (s.toLower() == "quit"||s.toLower() == "q") {        this->close();    }    stack<double> sn;    stack<QChar> sc;    for (int i = 0; i < s.size();) {        if(s[i] >= '0' && s[i] <= '9') {            int j = i + 1;            for (; j < s.size() && ((s[j] >= '0' && s[j] <= '9') || s[j] == '.'); ++j);            if (j < s.size()) {                sn.push(s.mid(i,j-i).toDouble());                i = j;            } else {                sn.push(s.mid(i,j-i).toDouble());                i = j + 1;            }        } else if (s[i] == '('){            sc.push(s[i]);            i++;        } else if (s[i] == '*' || s[i] == '/'){            if(sc.size() != 0&&sc.top() == '-' && sc.size() >= sn.size() && sn.size() >= 1){                double x = sn.top();                sn.pop();                sn.push(-x);                sc.pop();            }            if (!sc.empty() && sc.top() == '*') {                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(x * y);                sc.pop();            } else if (!sc.empty() &&sc.top() == '/'){                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(y / x);                sc.pop();            }            sc.push(s[i]);            i++;        } else if (s[i] == '+') {            if (!sc.empty() &&sc.top() == '*') {                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(x * y);                sc.pop();            } else if (!sc.empty() &&sc.top() == '/'){                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(y / x);                sc.pop();            } else if (!sc.empty() &&sc.top() == '-'){                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(y - x);                sc.pop();            } else if (!sc.empty() &&sc.top() == '+'){                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(y + x);                sc.pop();            }            sc.push(s[i]);            i++;        } else if (s[i] == '-') {            if (!sc.empty() &&sc.top() == '*') {                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(x * y);                sc.pop();            } else if (!sc.empty() &&sc.top() == '/'){                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(y / x);                sc.pop();            } else if (!sc.empty() &&sc.top() == '-'){                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(y - x);                sc.pop();            } else if (!sc.empty() &&sc.top() == '+'){                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(y + x);                sc.pop();            }            sc.push(s[i]);            i++;        } else if (s[i] == ')') {            while(!sc.empty() && sc.top() != '('){                if (!sc.empty() &&sc.top() == '+') {                    double x = sn.top();                    sn.pop();                    double y = sn.top();                    sn.pop();                    sn.push(x + y);                    sc.pop();                } else if (!sc.empty() &&sc.top() == '-') {                    if (sn.size() > 1&& sc.size() <= sn.size()){                        double x = sn.top();                        sn.pop();                        double y = sn.top();                        sn.pop();                        sn.push(y - x);                        sc.pop();                    } else {                        double x = sn.top();                        sn.pop();                        sn.push(-x);                        sc.pop();                    }                } else if (!sc.empty() &&sc.top() == '*') {                    double x = sn.top();                    sn.pop();                    double y = sn.top();                    sn.pop();                    sn.push(x * y);                    sc.pop();                } else if (!sc.empty() &&sc.top() == '/') {                    double x = sn.top();                    sn.pop();                    double y = sn.top();                    sn.pop();                    sn.push(y / x);                    sc.pop();                }            }            if (!sc.empty() &&sc.top() == '(')                sc.pop();            i++;        } else {            ui->textEdit_2->setText(s+'\n'+"Wrong calculate! Illegal Input!");            return;        }    }    while (!sc.empty()) {        if (sc.top() == '('){            sc.pop();            continue;        } else if (!sc.empty() &&sc.top() == '+') {            if (sn.size() == 1) {                break;            } else if (sn.size() > 1){                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(x + y);            }        } else if (!sc.empty() &&sc.top() == '-') {            if (sn.size() == 1){                double x = sn.top();                sn.pop();                sn.push(-x);                break;            } else if (sn.size() > 1) {                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(y - x);            }        } else if (!sc.empty() &&sc.top() == '*') {            if (sn.size() == 1){                break;            } else if (sn.size() > 1) {                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                sn.push(x * y);            }        } else if (!sc.empty() &&sc.top() == '/') {            if (sn.size() == 1){                break;            } else if (sn.size() > 1) {                double x = sn.top();                sn.pop();                double y = sn.top();                sn.pop();                if (x == 0) {                    ui->textEdit_2->setText(s+'\n'+"Wrong calculate! No divide zero");                    return;                }                sn.push(y / x);            }        }        sc.pop();    }    ui->textEdit_2->setText(s+"="+QString::number(sn.top())+'\n'+"Success calculate!");}



原创粉丝点击