QT算数表达式求值
對之前的那個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!"); }
 
總結
 
                            
                        