日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT算数表达式求值

發布時間:2025/4/16 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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!"); }


總結

以上是生活随笔為你收集整理的QT算数表达式求值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。