#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. TensorFlow使用记录 (六): 优化器

    0. tf.train.Optimizer tensorflow 里提供了丰富的优化器,这些优化器都继承与 Optimizer 这个类.class Optimizer 有一些方法,这里简单介绍下: 0 ...

  2. template模板循环嵌套循环

    template嵌套循环写法:在第一次循环里面需要循环的地方再写个循环,把要循环的数据对象改为第一层的循环对象别名 //template模板循环嵌套循环 <script id="ban ...

  3. TCP被动打开 之 第三次握手-接收ACK

    假定客户端主动打开,发送syn包到服务器,服务器创建连接请求控制块加入到队列,进入TCP_NEW_SYN_RECV 状态,发送syn+ack给客户端,并启动定时器,等待客户端回复最后一个握手ack: ...

  4. Alpha冲刺(2/6)

    队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11861798.html 作业博客: https://edu.cnblogs.com/campus/fz ...

  5. kernel hacking的一些网站

    很全面的网站,下面的网站基本都可以从该地址找到. 新手必备 subscrible/unsubscrible mail list mail list archive kernel git mainlin ...

  6. LC 646. Maximum Length of Pair Chain

    You are given n pairs of numbers. In every pair, the first number is always smaller than the second ...

  7. localStorage基本了解及使用

    以下内容来自: https://www.cnblogs.com/st-leslie/p/5617130.html  感谢大佬的分享 一.什么是localStorage.sessionStorage 在 ...

  8. Python核心编程练习题

    1.输入一个数值,判断是否为正数,负数,小数,以及字符串 import re def is_number(num): pattern = re.compile(r'^[-+]?[-0-9]\d*\.\ ...

  9. django在进行模板render(渲染)时,对传过来的是字典中包含字典应用方法

    网上自强学堂参考的 views.py def home(request): info_dict = {'site': u'自强学堂', 'content': u'各种IT技术教程'} return r ...

  10. 浅谈微信小程序生命周期

    之前在做微信小程序的时候,一直对生命周期里面的onLoad,onShow,onUnload不是很理解.比如说什么时候会触发onUnload. 经过一段时间的测试发现,普通页面的onUnload在三种情 ...