对之前的那个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!");
}