简单计算器 (关于栈的一种应用)

题目:简单计算器
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

样例:
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36

思路:利用栈,创建两个栈,一个是用来存数的,一个用来存运算符的,因为运算符之间是有优先级关系,所以要定义一个函数用来判断其优先级,当后来即将存的优先级高于栈顶的,则将其存入栈顶,如果后来的优先级是低于栈顶的,则要让运算符的栈的栈顶与存数的栈的前两个,进行运算,然后把结果再存入存数的栈顶。依次这样,最后存数的栈剩下的那个栈顶就是最后的结果;

新技巧:1:这里是栈的一种新的用法,即关于优先级问题的处理,可以通过满足其优先级关系就进栈,不满足则进行一系列操作,就是说有关优先级的问题可以考虑用栈来处理;
2:关于优先级的问题,如果无法用数值等来比较,则自己定义函数来将优先级排出来,如果很杂的时候,在情况不多的时候可以一个一个情况列出来;

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>struct Node {double val;char ch;Node *next;
};struct stacks{Node *top;Node *bottom;
};int compere(char ch1,char ch2);
double sumulete (double a,double b,char x);int main()
{double sum,b1,b2,b3;int tag,i,num;char ch,a[205];while(gets(a)!=NULL){if(strcmp(a,"0")==0)break;stacks *st_number=(stacks *)malloc(sizeof(stacks ));st_number->top=(Node *)malloc(sizeof(Node ));st_number->top->next=nullptr;st_number->bottom=st_number->top;stacks *st_sign=(stacks *)malloc(sizeof(stacks ));st_sign->top=(Node *)malloc(sizeof(Node ));st_sign->top->ch='#';st_sign->top->next=nullptr;st_sign->bottom=st_sign->top;tag=0;sum=0;num=strlen(a);for(i=0;i<=num;i++){if(a[i]==' ')continue;else if(a[i]<='9'&&a[i]>='0'){sum=sum*10+a[i]-'0';tag=1;}else{if(tag){Node *temp=(Node *)malloc(sizeof(Node ));temp->val=sum;temp->next=st_number->top;st_number->top=temp;tag=0;sum=0;}if(compere(st_sign->top->ch,a[i])<0){Node *temp=(Node *)malloc(sizeof(Node ));temp->ch=a[i];temp->next=st_sign->top;st_sign->top=temp;}else if(compere(st_sign->top->ch,a[i])>0){b1=st_number->top->val;Node *tt=st_number->top;st_number->top=tt->next;free(tt);b2=st_number->top->val;b3=sumulete(b1,b2,st_sign->top->ch);st_number->top->val=b3;Node *ss=st_sign->top;st_sign->top=ss->next;free(ss);i--;}else{Node *tt=st_sign->top;st_sign->top=tt->next;free(tt);}}}printf("%.2f\n",st_number->top->val);}return 0;
}double sumulete (double a,double b,char x)
{double t;switch(x){case '*':t=a*b;break;case '/':t=b/a;break;case '+':t=a+b;break;case '-':t=b-a;break;}return t;
}int compere(char ch1,char ch2)
{int tag;if(ch2=='\0'){if(ch1=='#')tag=-1;elsetag=1;}else  if(ch1=='+'||ch1=='-'){if(ch2=='+'||ch2=='-'||ch2==')')tag=1;elsetag=-1;}else  if(ch1=='*'||ch1=='/'){if(ch2=='(')tag=-1;elsetag=1;}else  if(ch1=='('){if(ch2==')')tag=0;elsetag=-1;}else  if(ch1==')')tag=1;else  if(ch1=='#')tag=-1;return tag;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中模运算_Python中的模运算

所谓取模运算&#xff0c;就是计算两个数相除之后的余数&#xff0c;符号是%。如a % b就是计算a除以b的余数。用数学语言来描述&#xff0c;就是如果存在整数n和m&#xff0c;其中0 < m < b&#xff0c;使得$ a n * b m $&#xff0c;那么$ a \% b a - n * b m $。先…

伟大公司为什么需要技术型领导?

Facebook前工程总监黄易山撰写了一系列文章&#xff0c;很好地总结了Facebook卓越研发文化中的宝贵经验。本文是这一系列文章的第五篇&#xff0c;也是最后一篇。 何谓技术型领导 所有从外部聘用的管理人员包括技术部门负责人&#xff0c;都必须能够编写代码&#xff0c;并且…

css样式变 及实际用法

<html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>引入外部样式</title><link rel" stylesheet" href"home.css&…

服务器部署的参数文档,服务器参数配置

服务器参数配置 内容精选换一换源端服务器迁移至华为云后&#xff0c;最终将迁移到弹性云服务器上。因此在迁移前&#xff0c;您需要在华为云中创建一个或多个弹性云服务器。进入“弹性云服务器”页面。关于参数的详细信息&#xff0c;请参见购买弹性云服务器。Windows系统的目…

扩散法及其改进

扩散法是一种静态路由算法,每一个输入的分组都被从除输入线路之外的所有其它线路上转发出去.扩散法显然会产生大量的分组副本,因此必须有一些办法来抑制无限的转发.1.一种办法是在分组头中携带一个跳数计数器,分组每到一个节点其跳数计数器就减1,当计数器为0时分组被丢弃.计数器…

h5页 点击返回时关闭_在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口...

最近在使用微信、支付宝、百度钱包实现网页支付&#xff0c;对支付成功将自动关闭页面&#xff0c;对于支付失败&#xff0c;将显示错误信息。当在错误页面的时候&#xff0c;点击返回或者Android物理按键上一步的时候&#xff0c;将关闭页面。在微信、支付宝、百度钱包中&…

串操作指令

串操作指令可以方便对一组连续的数据进行操作。串操作后自动根据DF标志位修改ESI和EDI&#xff0c;DF 0时&#xff0c;ESI&#xff0c;EDI递增&#xff0c;DF 1时&#xff0c;ESI&#xff0c;EDI递减。串操作指令有2组&#xff0c;1组实现数据串传送&#xff0c;另1组实现数据…

IS-IS基本配置

实验内容&#xff1a;现在网络中有4台路由器&#xff0c;用户希望利用这4台路由器通过IS-IS协议实现网络互联&#xff0c;并且因为R1和R2性能相对较低&#xff0c;所以还要使这两台路由器处理的数据信息相对较少。 网络拓扑&#xff1a; 实验分析&#xff1a; 根据题意可知R1和…

高并发高流量网站架构

Web2.0的兴起&#xff0c;掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念&#xff0c;细分了网站功能和用户群&#xff0c;不仅成功的造就了一大批新生的网站&#xff0c;也极大的方便了上网的人们。但Web2.0以用户为导向的理念&#xff0c;使得新生的网站有…

多处理机的进程调度方式

一.自调度方式 二.成组调度方式 三.专用处理机分配方式

枚举类型用法_Mybatis-plus常见用法总结三

前面已经介绍了Mybatis-plus基本用法&#xff0c;今天为大家分享一些Mybatis-plus高级应用逻辑删除自动注入枚举类型处理Sql注入器多租户表结构CREATE TABLE sys_role ( id varchar(64) NOT NULL COMMENT 主键, code varchar(64) NOT NULL DEFAULT COMMENT 角色编码, name …

NOIP 2011 Day2

tags: 贪心模拟NOIP categories:信息学竞赛总结计算系数 Solution 根据二项式定理,\[ \begin{align} (ab)^n\sum_{k0}^nC_{n}^{k}a^kb^{n-k} \end{align} \] 那么\[ \begin{align}(axby)^k&\sum_{p0}^kC_{k}^p(ax)^p(by)^{k-p}\\ &\sum_{p0}^k(C_{k}^pa^pb^{k-p})x^py^…

VS Code的golang开发配置 之 代码提示

之前用VS Code的时候&#xff0c;发现自己的代码的提示一直不好&#xff0c;换用JetBrain的Goland的代码提示是好了&#xff0c;但是比较占用资源。在网上找了一些资料&#xff0c;发现很多人也是遇到第三方或者自己的代码无法提示的情况&#xff0c;但是都没有下文了。后来发现…

使用oprofile分析性能瓶颈

使用oprofile分析性能瓶颈 1. 概述oprofile 是 Linux 平台上&#xff0c;类似 INTEL VTune 的一个功能强大的性能分析工具。其支持两种采样(sampling)方式&#xff1a;基于事件的采样(event based)和基于时间的采样(time based)。基于事件的采样是oprofile只记录特定事件&#…

什么是死锁

死锁是多个进程在运行过程中因竞争资源时产生的一种僵局。 各并发资源彼此等待对方拥有的资源&#xff0c;且在得到对方资源前不释放自己的资源。

python数据工程师 面试题_阿里P7工程师耗时两天整理的292道python大厂面试题,内含解析!...

前言相对于python大家应该都不会陌生吧&#xff01;现在java跟python可以算的是势均力敌了&#xff0c;所以现在学习python 的小伙伴也是越来越多了&#xff0c;可是学完之后就能找到称心如意的工作了吗&#xff1f;很多小伙伴学习Python的时候感觉很简单&#xff0c;但是到了去…

数组复制

在Java里面,可以用复制语句”AB”给基本类型的数据传递值,但是如果A,B是两个同类型的数组&#xff0c;复制就相当于将一个数组变量的引用传递给另一个数组&#xff1b;如果一个数组发生改变&#xff0c;那么引用同一数组的变量也要发生改变。 1.使用FOR循环,将数组的每个元素复…

IntelliJ IDEA 对于generated source的处理

IntelliJ IDEA 对于generated source的处理 学习了&#xff1a;https://stackoverflow.com/questions/5170620/unable-to-use-intellij-with-a-generated-sources-folder 如果有generated source &#xff0c;例如使用gRPC过程中生成的&#xff0c;可以使用鼠标右键点击使之成为…

产生死锁的原因

一 竞争资源&#xff0c;但是资源的数目不能满足进程的需要。 二 进程间推进顺序非法&#xff0c;进程在运行过程中请求和释放资源的顺序不当。

fabric shim安装合约_hyperledger fabric 开发第一个智能合约

一、编写智能合约代码HelloWorld.go&#xff0c;go语言实现&#xff0c;代码很简单&#xff0c;每个合约包含两个方法&#xff0c;Init、Invoke。package mainimport ("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperled…