C++练习 | 基于栈的中缀算术表达式求值(double类型
#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类型的更多相关文章
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- Dijkstra的双栈算术表达式求值算法
这次来复习一下Dijkstra的双栈算术表达式求值算法,其实这就是一个计算器的实现,但是这里用到了不一样的算法,同时复习了栈. 主体思想就是将每次输入的字符和数字分别存储在两个栈中.每遇到一个单次结束 ...
- 算法手记(2)Dijkstra双栈算术表达式求值算法
这两天看到的内容是关于栈和队列,在栈的模块发现了Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app. 编程语言系统一般都内置了对算术表达式的处理,但是他们是如何在内部实现的呢?为了 ...
- 栈的一个实例——Dijkstra的双栈算术表达式求值法
Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) ). 该方法是 使用两个栈分别存储算术表达式的运算符与操作数 忽略左括号 遇到右括 ...
- 【算法】E.W.Dijkstra算术表达式求值
算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...
- page80-栈用例-算术表达式求值
表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时 ...
- OpenJudge计算概论-简单算术表达式求值
/*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...
- [Java]算术表达式求值之三(中序表达式转二叉树方案 支持小数)
Entry类 这个类对表达式的合法性进行了粗筛: package com.hy; import java.io.BufferedReader; import java.io.IOException; ...
- java实现算术表达式求值
需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后 ...
随机推荐
- js基础----数组
1.数组如何定义 //第一种定义方法 var arr=[1,2,3,4]; //第二种定义方法 var arr=new Array(1,2,3,4); 两者没有任何区别,[]的性能可能略高,因为代码短 ...
- vmvare ubuntu虚拟机固定ip设置
1.vmvare网络设置 2.window网络设置 3.ubuntu网络设置 先ifconfig 查看ip 已经设置为192.168.122.128 sudo vim /etc/network/int ...
- GPS定位RTK解决方案
GPS差分: 实时差分定位是指在测量点上实时得到高精度的定位结果.这种模式的具体方法是:在一个已知测站上架设GPS基准站接收机和数据电台,连续跟踪所有可见卫星,并通过数据电台向移动站发送差分改正数据. ...
- Windows10 修改键位映射
https://blog.csdn.net/lhdalhd1996/article/details/90741092 1.为什么要修改键位我的笔记本键盘上下键是这样的: 很想捶死产品经理,你是从来不用 ...
- ubuntu下如何使得普通用户能够启动wireshark?
一. 将dumpcap的用户组更改为wireshark sudo chgrp wireshark /usr/bin/dumpcap 二. 设置其他用户也具有与root一样的权限来执行dumpcap s ...
- android 9.0以上charles https抓包
以前安装证书的方式无效了,必须将下载的证书复制到/system/etc/security/cacerts/目录, 步骤: 1.现在手机上安装好 chls.pro/ssl下载得到一个 charles-p ...
- System 源码阅读
System 属性说明 /** * System 类包含了几个有用的字段和方法,并且不能被实例化. * * @author unascribed * @since 1.0 */ public fina ...
- Linux搭建ftp服务器简单教程及使用方法
参考文章:https://www.waitig.com/linux-or-centos-install-vsftpd-and-setup-it.html 步骤概括如下: 安装:yum install ...
- Django框架 选项卡加active类的方案
------html部分----- <div class="left-menu"> <div class="menu-body"> &l ...
- RSA签名、验签、加密、解密
最近在做一个项目,与一个支付渠道进行连接进行充值,为了安全,每个接口访问时,都要先登陆(调用登陆接口),拿到一个sessionKey,后续业务接口内容用它来进行3DES加密处理.而登陆需要用到RSA进 ...