之前的不完整实现:https://www.cnblogs.com/lnlin/p/8151057.html
首先是界面,Qt Creator直接画就行
然后直接贴代码,具体实现逻辑和之前写的没啥区别,只不过代码更加简略了。
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <string> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); QString s1; // 输入的计算式 QString calculator(); // 计算结果 private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); void on_pushButton_4_clicked(); void on_pushButton_5_clicked(); void on_pushButton_6_clicked(); void on_pushButton_7_clicked(); void on_pushButton_8_clicked(); void on_pushButton_9_clicked(); void on_pushButton_10_clicked(); void on_pushButton_11_clicked(); void on_pushButton_12_clicked(); void on_pushButton_13_clicked(); void on_pushButton_14_clicked(); void on_pushButton_16_clicked(); void on_pushButton_15_clicked(); void on_pushButton_17_clicked(); void on_pushButton_18_clicked(); void on_pushButton_19_clicked(); private: Ui::MainWindow *ui; }; int calculate(std::string s); // 计算结果 #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" #include <iostream> #include <string> #include <vector> #include <limits.h> #include <sstream> #include <algorithm> #include <stack> #include <math.h> #include <iterator> #include <numeric> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } // 在计算器界面按键产生的效果 // 1 void MainWindow::on_pushButton_clicked() { s1 += '1'; ui->lineEdit->setText(s1); } // 2 void MainWindow::on_pushButton_2_clicked() { s1 += '2'; ui->lineEdit->setText(s1); } // 3 void MainWindow::on_pushButton_3_clicked() { s1 += '3'; ui->lineEdit->setText(s1); } // 4 void MainWindow::on_pushButton_4_clicked() { s1 += '4'; ui->lineEdit->setText(s1); } // 5 void MainWindow::on_pushButton_5_clicked() { s1 += '5'; ui->lineEdit->setText(s1); } // 6 void MainWindow::on_pushButton_6_clicked() { s1 += '6'; ui->lineEdit->setText(s1); } // 7 void MainWindow::on_pushButton_7_clicked() { s1 += '7'; ui->lineEdit->setText(s1); } // 8 void MainWindow::on_pushButton_8_clicked() { s1 += '8'; ui->lineEdit->setText(s1); } // 9 void MainWindow::on_pushButton_9_clicked() { s1 += '9'; ui->lineEdit->setText(s1); } // 0 void MainWindow::on_pushButton_10_clicked() { s1 += '0'; ui->lineEdit->setText(s1); } // + void MainWindow::on_pushButton_11_clicked() { s1 += '+'; ui->lineEdit->setText(s1); } // - void MainWindow::on_pushButton_12_clicked() { s1 += '-'; ui->lineEdit->setText(s1); } // * void MainWindow::on_pushButton_13_clicked() { s1 += '*'; ui->lineEdit->setText(s1); } // / void MainWindow::on_pushButton_14_clicked() { s1 += '/'; ui->lineEdit->setText(s1); } // = void MainWindow::on_pushButton_16_clicked() { s1 += '='; ui->lineEdit->setText(s1); ui->lineEdit_2->setText(calculator()); } // clear void MainWindow::on_pushButton_15_clicked() { s1 = ""; ui->lineEdit->setText(s1); ui->lineEdit_2->setText(""); } // ( void MainWindow::on_pushButton_17_clicked() { s1 += '('; ui->lineEdit->setText(s1); } // ) void MainWindow::on_pushButton_18_clicked() { s1 += ')'; ui->lineEdit->setText(s1); } // 回退 void MainWindow::on_pushButton_19_clicked() { s1.chop(1); // 删除最后一个字符 ui->lineEdit->setText(s1); } QString MainWindow::calculator() { std::string s = s1.toStdString(); int res = calculate(s); return QString::number(res, 10);// 将int转化为QString } // 计算一个有效地算式 并返回结果 int calculate(std::string s) { int num = 0, res = 0, n = s.size(); std::stack<int> st; char op = '+'; for(int i = 0; i < n; i++) { char c = s[i]; if(c >= '0' && c <= '9'){ num = num * 10 + c - '0'; } else if(c == '(') { int j = i, cnt = 0; for( ; i < n; i++){ if(s[i] == '(') cnt++; if(s[i] == ')') cnt--; if(cnt == 0) break; } num = calculate(s.substr(j+1,i-j-1)); } if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || i == n-1){ if(op == '+') st.push(num); if(op == '-') st.push(-num); if(op == '*' || op == '/'){ int temp = (op == '*') ? (st.top() * num) : (st.top() / num); st.pop(); st.push(temp); } op = s[i]; num = 0; } } while(!st.empty()){ res += st.top(); st.pop(); } return res; }