#include<iostream>
#include<stack>
#include<cmath>
using namespace std;
char ch; bool f(char t)
{
if(t=='+'||t=='-'||t=='*'||t=='/'||t=='('||t==')'||t=='=')
return ;
return ;
} double cal(double t1,double t2,char c)
{
switch(c)
{
case '+':return t1+t2;
case '-':return t1-t2;
case '*':return t1*t2;
case '/':return t1/t2;
}
return ;
} int cmp(char t1,char t2)
{
int q1=,q2=;
switch(t1)
{
case '+':q1=;break;
case '-':q1=;break;
case '*':q1=;break;
case '/':q1=;break;
case '(':q1=;break;
case ')':q1=-;break;
}
switch(t2)
{
case '+':q2=;break;
case '-':q2=;break;
case '*':q2=;break;
case '/':q2=;break;
case '(':q2=;break;
case ')':q2=-;break;
}
if(q1==-&&q2==)
return ;
if(q1>q2)
return ;
if(q1<=q2)
return ;
return -;
} double z()
{
double ans=;
int a[],i=,flag=;
a[++i]=ch-'';
while(cin>>ch&&!f(ch))
{
if(ch=='.')
{
flag=i;
continue;
}
a[++i]=ch-'';
}
if(flag==)
flag=i;
for(int j=;j<=i;j++)
{
ans+=a[j]*pow(,flag-j);
}
return ans;
} int main()
{
stack<double> OPND;//存放数字
stack<char> OPTR;//存放运算符
double t1,t2,t3;
while(cin>>ch&&ch!='=')
{
if(f(ch))
{
OPTR.push(ch);
cin>>ch;
}
else
{
OPND.push(z());
}
while(ch!='=')
{
if(f(ch))
{
if(OPTR.empty())
{
OPTR.push(ch);
cin>>ch;
continue;
}
if(cmp(ch,OPTR.top())==)//后出现的优先级小,存储
{
OPTR.push(ch);
cin>>ch;
continue;
}
else if(cmp(ch,OPTR.top())==)//后出现的优先级大,计算
{
char c1=ch;
cin>>ch;
t2=z();
t1=OPND.top();
OPND.pop();
t3=cal(t1,t2,c1);
OPND.push(t3);
}
else
{
OPTR.pop();
cin>>ch;
}
}
else
{
OPND.push(z());
}
}
while(!OPTR.empty())
{
ch=OPTR.top();
OPTR.pop();
t2=OPND.top();
OPND.pop();
t1=OPND.top();
OPND.pop();
t3=cal(t1,t2,ch);
OPND.push(t3);
}
printf("%.2lf\n",OPND.top());
OPND.pop();
getchar();
}
return ;
}

重点大概在于数据接收

C++练习 | 基于栈的中缀算术表达式求值(double类型的更多相关文章

  1. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  2. Dijkstra的双栈算术表达式求值算法

    这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...

  3. 算法手记(2)Dijkstra双栈算术表达式求值算法

    这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了 ...

  4. 栈的一个实例——Dijkstra的双栈算术表达式求值法

    Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...

  5. 【算法】E.W.Dijkstra算术表达式求值

    算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...

  6. page80-栈用例-算术表达式求值

    表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时 ...

  7. OpenJudge计算概论-简单算术表达式求值

    /*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...

  8. [Java]算术表达式求值之三(中序表达式转二叉树方案 支持小数)

    Entry类 这个类对表达式的合法性进行了粗筛: package com.hy; import java.io.BufferedReader; import java.io.IOException; ...

  9. java实现算术表达式求值

    需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...

随机推荐

  1. 查找:find、locate、which、whereis

    有find . locate . which . whereis 一.find 命令格式:[root@localhost ~]# find 搜索路径 [选项] 搜索内容 find是比较特殊的命令,它有 ...

  2. 免费馅饼~-~ (hdu 1176

    当我准备要写这个随笔的时候是需要勇气的. 掉馅饼嘛,肯定是坑. (hdu1176 话说,gameboy人品太好,放学回家路上有馅饼可捡.还就在0~10这11个位置里,当馅饼开始掉的时候,gameboy ...

  3. docker自动启动容器

    Docker提供了重新启动策略 来控制容器在退出时或Docker重新启动时是否自动启动.重新启动策略可确保以正确的顺序启动链接的容器.Docker建议您使用重新启动策略,并避免使用进程管理器来启动容器 ...

  4. C# WebServices 客户端服务端

    一.编写一个WebService 开发环境:VS2012 1.编写webservice阶段 打开VS2012,新建一个空的web应用程序,我这里用的Framework版本是4.5的 新建好web应用程 ...

  5. Java多线程-程序运行堆栈分析

    class文件内容 class文件包含JAVA程序执行的字节码:数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符:文件开头有一个0xcafebabe(16进制)特殊的一个标志. ...

  6. js移动端触屏事件

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  7. 环信-(php)服务器端REST API

    <?php namespace Home\Controller; use Think\Controller; /** * 环信-服务器端REST API * @author limx <l ...

  8. mysql使用命令行执行存储过程

    编写存储过程sql 以给brand表添加phone字段为例: DROP PROCEDURE IF EXISTS UpdateColum; CREATE PROCEDURE UpdateColum() ...

  9. JScript 对字符串、数组处理的常用方法

    1.anchor 方法 在对象中的指定文本两端放置一个有 NAME 属性的 HTML 锚点.     strVariable.anchor(anchorString) var strVariable ...

  10. Python:百科

    ylbtech-Python:百科 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越 ...