QT_计算器的简单实现

摘要:
=“#”){//结束标志57QCharc=opStack.pop();58postFix.push_back(“”);//用空格59postFix.ppush_back分隔运算符;//将堆栈中剩余的运算符添加到后缀表达式60}61qDebug()的末尾;62}1//计算后缀表达式23voidMainWindow::evaluation()4{5QStringtmp;6QStack<double>ans;78 for 9{10qDebug()<<postFix[i]<<i;11if12tmp.push_back;13 else if{//相当于遇到运算符或括号14if(!Tmp.isEmpty())15{16ans.push;17tmp.clear();18}19qDebug)<ans。top()˂˂tmp isEmpty();20} 21否则{//遇到一个运算符,从堆栈中弹出两个数字,进行计算,结果被堆叠22doublea=0,b=0;23开关{24case}!

QT_计算器的简单实现第1张QT_计算器的简单实现第2张

 1  2 //转换为后缀表达式,实现最主要功能
 3 void MainWindow::toPostfix ()
 4 {
 5     QString exp = ui->lineEdit->text ();
 6     //QString exp = "0.3/(5*2+1)", postfix;
 7 
 8     QString tmp = exp;
 9 
10     int j;
11     //如果只有单个数字时
12     for (j = 0; j < tmp.size () && (tmp[j].isDigit () || tmp[j] == '.'); j++) {
13         postFix.push_back (tmp[j]);
14     }
15     if (j == tmp.size ()) {
16         postFix.push_back (' ');
17         return;
18     }
19     postFix.clear ();
20 
21     for (int i = 0; i < exp.size (); i++)
22     {
23         qDebug() << i << exp[i];
24         if (exp[i].isDigit () || exp[i] == '.') {//为数字或者小数点
25             postFix.push_back (exp[i]);          //直接添加到后缀表达式后面
26         }
27         else if (exp[i] == '(') {                //入操作符栈
28             opStack.push (exp[i]);
29         }
30         else if (exp[i] == ')') {                //遇到右括号,就转换成空格添加到后缀表达式中
31             postFix.push_back (' ');
32             while (opStack.top () != '(')
33             {
34                 //只要遇到右括号,则在操作符栈中将栈顶下一次出现'('前的操作符全部依次添加到后缀表达式后面
35                 //因为进栈的时候,是栈顶操作符优先级低;所以出栈的时候,优先级高->低依次添加到后缀表达式后
36                 postFix.push_back (opStack.pop ());
37                 qDebug() << postFix;
38             }
39             opStack.pop ();                     //遇到右括号一次,左括号也相应少一次
40         }
41         //运算符比栈顶的优先级高时,入栈顶
42         else if (getLevel (exp[i]) > getLevel (opStack.top ()))
43         {
44             //将操作符和操作数用空格分开
45             postFix.push_back (' ');
46             opStack.push (exp[i]);
47         }
48         else {
49             postFix.push_back (' '); qDebug() << postFix;
50             //当操作符比栈顶的操作符优先级低时,从栈顶(弹出)pop()运算符,添加到后缀表达式中
51             while (getLevel (exp[i]) <= getLevel (opStack.top ()))
52                 postFix.push_back (opStack.pop ());
53             opStack.push (exp[i]);      //栈顶优先级低则,入栈
54         }
55     }
56     while (opStack.top () != '#') {    //结束标志
57         QChar c = opStack.pop ();
58         postFix.push_back (' ');       //操作符之间用空格分开
59         postFix.push_back (c);         //将栈中剩余的操作符添加到后缀表达式后面
60     }
61     qDebug() << postFix;
62 }
 1 //计算后缀表达式
 2 
 3 void MainWindow::evaluation ()
 4 {
 5     QString tmp;
 6     QStack<double> ans;
 7 
 8     for (int i = 0; i < postFix.size (); i++)
 9     {
10         qDebug() << postFix[i] << i;
11         if (postFix[i].isDigit () || postFix[i] == '.')
12             tmp.push_back (postFix[i]);
13         else if (postFix[i] == ' ') {      //相当于遇到一个操作符或者是括号
14             if (!tmp.isEmpty ())
15             {
16                 ans.push (tmp.toDouble ());
17                 tmp.clear ();
18             }
19             qDebug() << ans.top () << tmp.isEmpty ();
20         }
21         else {       //遇到操作符,从栈中弹出两个数,进行计算,并将结果入栈
22             double a = 0, b = 0;
23             switch (postFix[i].cell ()) {
24             case '!': a = ans.pop ();ans.push (Fac(a)); break;
25 
26             case '+': a = ans.pop (); b = ans.pop ();
27                       ans.push (b + a); break;
28 
29             case '-': a = ans.pop (); b = ans.pop ();
30                       ans.push (b - a); break; //应该是后弹出栈的-先弹出栈的
31 
32             case '*': a = ans.pop (); b = ans.pop ();
33                       ans.push (b * a); break;
34             case '/':a = ans.pop (); b = ans.pop ();
35                      ans.push (b / a); break;
36 
37             case '%': a = ans.pop (); b = ans.pop ();
38                       ans.push ((int)b % (int)a); break;
39 
40             case '^': a = ans.pop (); b = ans.pop ();
41                       ans.push (Pow(b, a)); break;
42             default:
43                 break;
44             }
45             qDebug() << ans.top () << "top";
46         }
47     }
48     ui->lineEdit->setText (QString::number (ans.top ()));
49 }

//全部代码见,百度云

链接: https://pan.baidu.com/s/1qXQKPTM 密码: qwfn

免责声明:文章转载自《QT_计算器的简单实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Web--js高级--11月30日随笔PhpStorm一次性折叠所有函数或者方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

一.定时任务详解https://i.cnblogs.com/EditPosts.aspx

定时任务的详解 h每小时运行 d每天运行 w每周运行 m每个月运行 中毒时查看系统定时任务是否有病毒的脚本。 crontab -l 查看用户的定时任务 crontab -e 进入编辑界面增加定时任务 /var/spool/cron/root root用户定时任务的文件 定时任务的使用 一. 二. 查看定时任务日志----一定要会看日志 定时任务时...

图论:二分图判定

我其实只是想练一练二分图判定的,但是翻到了一个这么个题。。 双栈排序早有耳闻,非常欣赏当年的出题水平,堪称经典 这个题AC的人一定是个天才 废话不多说,双栈排序的思路我就不介绍了,没有那个水平,直接来说说怎么二分图染色 bool color(int x,int cl) { c[x]=cl; for(int tmp=g[x];tmp;tmp...

利用CSS实现带相同间隔地无缝滚动动画

说明:因为在移动上主要利用CSS来做动画,所以没有考虑其他浏览器的兼容性,只有-webkit这个前缀,如果需要其他浏览器,请自行补齐。 首先解释一下什么是无缝滚动动画, 例如下面的例子 See the Pen css实现上下循环滚动效果 by lilyH (@lilyH) on CodePen. ------------------------------...

IDEA快捷键大全

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发时的使用频率,简单分类列一下我最喜欢的十大快捷-神-键吧。 1 智能提示 Intellij首当其冲的当然就是Intelligence智能!基本的...

利用分支限界法求解单源最短路(Dijkstra)问题

分支限界法定义:采用Best fist search算法,并使用剪枝函数的算法称为分支界限法。 分支限界法解释:按Best first的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分支,不断重复这一过程,直到找到答案或者判定无解。 分支界限法常常用到优先队列来选择最佳扩展节点,有时也会用到普通队列,以先进先出为原则来进行筛选。 单源最短路...

centos 内存清理

在清理前内存使用情况 free -m 用以下命令清理内存 echo 1 > /proc/sys/vm/drop_caches 清理后内存使用情况再用以下命令看看。 free –m 多出很多内存了吧。 查看内存条数命令: dmidecode |grep -A16 "Memory Device$" ++++++++++++++++++++++++++++...