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。
- 上一篇:没有了
- 下一篇:没有了
