QT算数表达式求值
来源:互联网 发布:适合家政的软件 编辑:程序博客网 时间:2024/05/23 16:41
对之前的那个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!");}
阅读全文
0 0
- QT算数表达式求值
- 算数表达式求值
- 算数表达式求值
- 算数表达式求值
- 算数表达式求值
- 算数表达式求值
- 简单算数表达式求值
- 中缀算数表达式求值
- 算数表达式逻辑表达式求值
- C++ 实现 算数表达式求值
- 算数表达式求值C++实现
- 栈3-算数表达式求值
- Java字符串算数表达式求值
- 算数表达式求值(C语言)
- 运用栈对算数表达式求值
- 双栈算数表达式求值算法
- C语言 算数表达式求值(顺序栈应用实例)
- 算法(第四版) Dijkstra 算数表达式求值算法-双栈
- springMVC配置全局日期格式转化
- 记忆网络之Key-Value Memory Networks tensorflow实现
- java动态代理
- Redis核心知识——高级篇
- [USACO5.1]圈奶牛Fencing the Cows(凸包模板)
- QT算数表达式求值
- es6 入门(四):Set和Map数据解构
- Java线程
- 我遇到过的错误,异常
- 观看ThinkPHP感受
- 【技术研究】 CodeReview初识
- 原生JS实现轮播图的几种方式
- HDU 6098 Inversion
- 使用DOM方法解析xml文件