//转换为后缀表达式,实现最主要功能
void MainWindow::toPostfix ()
{
QString exp = ui->lineEdit->text ();
//QString exp = "0.3/(5*2+1)", postfix; QString tmp = exp; int j;
//如果只有单个数字时
for (j = ; j < tmp.size () && (tmp[j].isDigit () || tmp[j] == '.'); j++) {
postFix.push_back (tmp[j]);
}
if (j == tmp.size ()) {
postFix.push_back (' ');
return;
}
postFix.clear (); for (int i = ; i < exp.size (); i++)
{
qDebug() << i << exp[i];
if (exp[i].isDigit () || exp[i] == '.') {//为数字或者小数点
postFix.push_back (exp[i]); //直接添加到后缀表达式后面
}
else if (exp[i] == '(') { //入操作符栈
opStack.push (exp[i]);
}
else if (exp[i] == ')') { //遇到右括号,就转换成空格添加到后缀表达式中
postFix.push_back (' ');
while (opStack.top () != '(')
{
//只要遇到右括号,则在操作符栈中将栈顶下一次出现'('前的操作符全部依次添加到后缀表达式后面
//因为进栈的时候,是栈顶操作符优先级低;所以出栈的时候,优先级高->低依次添加到后缀表达式后
postFix.push_back (opStack.pop ());
qDebug() << postFix;
}
opStack.pop (); //遇到右括号一次,左括号也相应少一次
}
//运算符比栈顶的优先级高时,入栈顶
else if (getLevel (exp[i]) > getLevel (opStack.top ()))
{
//将操作符和操作数用空格分开
postFix.push_back (' ');
opStack.push (exp[i]);
}
else {
postFix.push_back (' '); qDebug() << postFix;
//当操作符比栈顶的操作符优先级低时,从栈顶(弹出)pop()运算符,添加到后缀表达式中
while (getLevel (exp[i]) <= getLevel (opStack.top ()))
postFix.push_back (opStack.pop ());
opStack.push (exp[i]); //栈顶优先级低则,入栈
}
}
while (opStack.top () != '#') { //结束标志
QChar c = opStack.pop ();
postFix.push_back (' '); //操作符之间用空格分开
postFix.push_back (c); //将栈中剩余的操作符添加到后缀表达式后面
}
qDebug() << postFix;
}
 //计算后缀表达式

 void MainWindow::evaluation ()
{
QString tmp;
QStack<double> ans; for (int i = ; i < postFix.size (); i++)
{
qDebug() << postFix[i] << i;
if (postFix[i].isDigit () || postFix[i] == '.')
tmp.push_back (postFix[i]);
else if (postFix[i] == ' ') { //相当于遇到一个操作符或者是括号
if (!tmp.isEmpty ())
{
ans.push (tmp.toDouble ());
tmp.clear ();
}
qDebug() << ans.top () << tmp.isEmpty ();
}
else { //遇到操作符,从栈中弹出两个数,进行计算,并将结果入栈
double a = , b = ;
switch (postFix[i].cell ()) {
case '!': a = ans.pop ();ans.push (Fac(a)); break; case '+': a = ans.pop (); b = ans.pop ();
ans.push (b + a); break; case '-': a = ans.pop (); b = ans.pop ();
ans.push (b - a); break; //应该是后弹出栈的-先弹出栈的 case '*': a = ans.pop (); b = ans.pop ();
ans.push (b * a); break;
case '/':a = ans.pop (); b = ans.pop ();
ans.push (b / a); break; case '%': a = ans.pop (); b = ans.pop ();
ans.push ((int)b % (int)a); break; case '^': a = ans.pop (); b = ans.pop ();
ans.push (Pow(b, a)); break;
default:
break;
}
qDebug() << ans.top () << "top";
}
}
ui->lineEdit->setText (QString::number (ans.top ()));
}

//全部代码见,百度云

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

qt_计算器的简单实现的更多相关文章

  1. JS中 计算器的简单制作

    今天学习的是JS中的if语句,除此之外老师还教给我们switch语句的用法, 我们用来写了简单计算器的算法,如下: <script> var a=prompt("请输入一个数字& ...

  2. Java语言编写计算器(简单的计算器)

    Java编写的一个简单计算器,本人还比较菜,只能这样了,有点代码冗余,不能连续计算. import javax.swing.*; import java.awt.*; import java.awt. ...

  3. java计算器(简单版)

    前言 之前在学习完Java的方法后,我发现自己可以开始写计算器这个"经典"的项目了,于是我花了一点时间写下了这个计算器的程序,也写下了这篇文章. 在这里,我需要说明一下,这个程序只 ...

  4. Android(java)学习笔记218:开发一个多界面的应用程序之人品计算器的简单实现

    1.开启新的Activity的方法: (1)Intent 意图 (2)intent.setAction("自定义")  记得在清单文件中声明 (3)intent.setData(前 ...

  5. Android(java)学习笔记161:开发一个多界面的应用程序之人品计算器的简单实现

    1.开启新的Activity的方法: (1)Intent 意图 (2)intent.setAction("自定义")  记得在清单文件中声明 (3)intent.setData(前 ...

  6. 计蒜客:百度的科学计算器(简单)【python神解】

    题目链接:https://nanti.jisuanke.com/t/15504 题解:python大法好啊,三行代码无人能敌啊! 下面给出AC代码: b=input() a=input() print ...

  7. 使用C#面向对象实现简易计算器(简单工厂模式)

    操作流程: 1. 新建Operation类 2. 新建OperationAdd类,并继承Operation类 3. 新建OperationSub类,并继承Operation类 4. 新建Operati ...

  8. 【IOS开发笔记03-视图相关】简单计算器的实现

    UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...

  9. JavaScript+HTML,简单的计算器实现

    成功进化到程序猿快一年多了, 还没写过计算器, 正好今天比较闲,随手写了个计算器,最简单的实现,核心是eval()方法,把字符串作为JS代码处理,把输入的信息拼接成字符串,点等号执行代码得到结果,出异 ...

随机推荐

  1. tcl调用tuxedo的一个demo

    Tuxedo是Oracle的一个商业中间件,一般用于通信. 如下是一个简单的调用tuxedo的so动态库实现,编译后,tcl脚本可以加载并调用这个so库实现对tuxedo的调用. 1. 代码例子,保存 ...

  2. ThinkPHP框架表单验证

    对注册到test表的表单进行验证 在注册之前要对表单进行验证: 用户名非空验证,两次输入密码必须一致即相等验证,年龄在18~50之间即范围验证,邮箱格式正则验证. 自动验证是ThinkPHP模型层提供 ...

  3. POJ1011

    今天搞了一下传说中的经典搜索题——poj1011,果然里面充斥着各种巧妙的剪枝,做完之后回味一下还是感觉构思太巧妙,所以总结记录一下加深理解. 原题:http://poj.org/problem?id ...

  4. BPMN流程图的绘制的注意要点

    1.分支网关的表达式,是在选择的线上设置. 2.在分支网关上,可以设置一个默认线的id. 3.并行网关,必须有开始,有结束.

  5. 我对windows消息机制的理解(参考深入浅出MFC,欢迎批评指正!!)

    以消息为基础,以事件驱动之 程序的进行依靠外部消息来驱动,即:程序不断等待任何可能的输入,然后做判断,然后再做适当的处理. 消息输入:操作系统捕获,以消息形式进入程序.(操作系统通过其USERS模块中 ...

  6. 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

    面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END

  7. linux中wc命令用法

    Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...

  8. 分享一个快速设置背景的js 自动获取背景图的长宽

    我来分享一个快速设置背景的js (需要jq支持!) 快速切图铺页面用---就是不需要手动输入背景图的长宽 自动获取背景图的长宽 : <div class="wrap"> ...

  9. u-boot 流程分析

    u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 ,  这个启动程序就叫启动加载程序(Boot ...

  10. 网络数据包发送工具PacketSender中文源码

    在网上发现了一个好用的工具PacketSender,数据包发送器.对于写网络程序来说,有很大的便利性.虽然在linux下,netcat工具也很好用,但是这个也不错. 原本是英文的,给翻译了一下.这是基 ...