#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. 编译报错:File ended while scanning use of xxx

    出现这个问题的原因是使用某些命令时,给出的参数不完整或者漏了半个大括号: 比如, Runaway argument? {adaptivity, dynamically changing environ ...

  2. Android_(控件)使用ListView显示Android系统SD卡的文件列表_02

    使用ListView显示Android SD卡中的文件列表 父类布局activity_main.xml,子类布局item_filelayout(一个文件的单独存放) 运行截图: 程序结构 <?x ...

  3. linux 上修改了nginx.conf 怎么重新加载配置文件生效

    步骤如下先利用/usr/local/nginx/sbin/nginx -t测试配置文件修改是否正常/usr/local/nginx/sbin/nginx -s reload重新加载 nginx 更改配 ...

  4. MemoScope.Net

    What is MemoScope.Net ? It's a tool to analyze .Net process memory: it can dump an application's mem ...

  5. 使用ViewFlipper实现广告信息栏的上下翻滚效果

    import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Gestu ...

  6. Postman系列之测试用例管理(二)

    实验简介 本文主要讲解Postman对多个测试用例的管理,让测试进行更有序,易于管理. 实验目的 Postman 测试集(Collections)管理的相关内容,它用来保存我们的 Request ,可 ...

  7. 反编译中的 匿名内部类 this.val$的问题【我改】

    转: 匿名内部类 this.val$的问题 一天偶尔在网上找到一个jar包,反编译后出现了如下的代码: public void defineAnonymousInnerClass(String nam ...

  8. 阶段3 3.SpringMVC·_07.SSM整合案例_09.ssm整合之Spring整合MyBatis框架配置事务

    spring加入声明式的事物 配置事物 配置事物管理器 需要一个dataSource,引入上面的dataSource 配置事务通知 引入上面的transactionManager事物管理器 find开 ...

  9. POJ 1182-食物链 [并查集] 《挑战程序设计竞赛》2.4

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  10. JSP 传统标签extends TagSupport

    1.控制JSP页面某一部分内容是否执行 public int doStartTag() 返回EVAL_BODY_INCLUDE,执行 返回SKIP_BODY,不执行 2.控制整个JSP页面是否执行 p ...