博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单计算器 (关于栈的一种应用)
阅读量:6718 次
发布时间:2019-06-25

本文共 3719 字,大约阅读时间需要 12 分钟。

题目:简单计算器

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
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
#include
#include
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; else tag=1; } else if(ch1=='+'||ch1=='-') { if(ch2=='+'||ch2=='-'||ch2==')') tag=1; else tag=-1; } else if(ch1=='*'||ch1=='/') { if(ch2=='(') tag=-1; else tag=1; } else if(ch1=='(') { if(ch2==')') tag=0; else tag=-1; } else if(ch1==')') tag=1; else if(ch1=='#') tag=-1; return tag;}

转载地址:http://apumo.baihongyu.com/

你可能感兴趣的文章
Arm-kernel 内存收集【转】
查看>>
HTML5之Canvas标签简要学习
查看>>
du熊学斐波那契I
查看>>
Silverlight1.1架构图
查看>>
js实现获取值传到input里边
查看>>
【原+转】用CMake代替makefile进行跨平台交叉编译
查看>>
swift3.0:CoreData的使用
查看>>
Silverlight实用窍门系列:3.Silverlight鼠标动态绘制矩形【实例源码下载】
查看>>
postmaster.c 中的 ListenAddresses
查看>>
托付和事件的使用
查看>>
关于Java的转义字符
查看>>
测试管理工具QC使用指南--QC用户
查看>>
使用FDO API连接到各种数据源
查看>>
CentOS 6.5下Redis安装记录
查看>>
Activiti-5.3工作流引擎-源码解析(流程文档解析)
查看>>
python3中的迭代器与生成器
查看>>
开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))...
查看>>
在虚拟机中搭建SQLITE环境,并测试其是否安装成
查看>>
jsp页面传递参数是如何与javabean进行关联的
查看>>
Sql Server的弱口令入侵测试以及防范
查看>>