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+" "+"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+" "+"Wrong calculate! No divide zero"); return; } sn.push(y / x); } } sc.pop(); } ui->textEdit_2->setText(s+"="+QString::number(sn.top())+" "+"Success calculate!"); }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了