用C语言中栈的思想实现加减乘除四则运算和括号的计算器

您所在的位置:网站首页 手机计算器先乘除后加减怎么操作的 用C语言中栈的思想实现加减乘除四则运算和括号的计算器

用C语言中栈的思想实现加减乘除四则运算和括号的计算器

2024-06-02 06:14:50| 来源: 网络整理| 查看: 265

文章目录 设计思路主要问题数据结构和主要函数代码实现

设计思路

将每个运算符设置优先级,运用栈先入后出的思想,从左到右扫描输入到电脑上的计算公式,将扫描到的数字数据和字符数据的优先级分别存入两个数组,再依次从两个数组中弹出对应的数据和计算符号进行计算。

主要问题

1.如何让计算机实现正确的符号计算顺序? 为每个符号设定相应的优先级,在这个程序中我将+,-优先级设置为1,*,/设置为2,(设置为3,)设置为0,=设置为-1,也就是最低等。 在从左到右扫描代数式时,若下一位符号优先级更大,则改符号可以直接推入存储符号的栈中;若下一位符号优先级相比较小,则在数字栈弹出两个数字,在符号位弹出一个符号进行运算。

符号| 序号 | 优先级 | +| -7 | 1 | –| -6 | 1 | x | -5 | 2 | / | -4 | 2 | ( | -3 | 3 | ) | -2 | 0 | =| -1 | -1|

2.如何实现多位数的扫描? 设置rate变量,正常情况下rate为10,前面扫描得到的数据在下一次扫描时乘上10再加上后面扫描的数据,若遇到小数点的情况则rate变为0.1,且之后的每次扫描rate都应该缩小10倍

3.如何实现括号位的计算? 当遇到左括号时,因为左括号的优先级大于任何一个运算符,所以左括号可以直接压入栈中,在压入栈中之后将左括号运算符改为右括号运算符,为了让括号内的运算符也可以成功压入栈栈中。 遇到右括号运算符时,右括号运算符只比等号运算符优先级大,所以读取到右括号运算符后计算机会开始计算括号内的式子,计算完括号内的式子后直接将左括号运算符从栈内弹出。

数据结构和主要函数

Struct fuhao s[7]运用结构存放不同的操作符和对应的优先级; Char str[30]用来存放输入的算式; double a[20]用来存放运算的数据; int b[20]用来存放操作符号所对应的在结构数组中的编号;

Void PUSH(nu,a[])为将操作数存放进数组a中; void PUSH1(nu,b[])为将操作符号对应的序号存放进数组b中; Double READ(*p)为读取字符串的数据,返回读取的数据; Double POP(a[])为弹出a数组顶部的操作数,返回操作数; int POP1(b[])为弹出b数组顶部的操作符对应序号; Int t 用来判断情况,double ans为计算后的最终结果;

代码实现 #include using namespace std; int lu=0; struct fuhao { char f; int x; }s[7]={{'+',1},{'-',1},{'x',2},{'/',2},{'(',3},{')',0},{'=',-1}}; void PUSH(double nu,double a[]) { int i=0; for(;i double rate=10.0,item=0; int x=0;//表示读取的是数字还是符号 p=p+lu; while(*p!='/n') { if(x==0) { if(*p=='+') {lu++;return -7;}//全局变量用来指示读取到的序号 else if(*p=='-') {lu++;return -6;} else if(*p=='*') {lu++;return -5;} else if(*p=='/') {lu++;return -4;} else if(*p=='(') {lu++;return -3;} else if(*p==')') {lu++;return -2;} else if(*p=='=') {lu++;return -1;} else if(*p>='0'||*p item=item+(*p-'0')*rate; rate=rate/10;}//rate可以解决读取连续两个数的问题 p++; lu++; x=1; } else//读取到不知名数字 { cout if(*p=='.') rate=0.1; else { if(rate==10) item=item*rate+*p-'0';//rate如果为10则比率依然不改变 else{ item=item+(*p-'0')*rate; rate=rate/10;} } p++; lu++; } return item; } } } int TOP(int b[]) { int i=0; for(;i int i=0,h; for(;i b[i]=9999; a[i]=9999; }//将两个数组都赋予初值最大值 PUSH1(-1,b);//在b数组底部放入=号 while(t!=2)//t表示三种情况,0表示读取数据,1表示计算数据,2表示得出结果 { if(t==0) h=READ(str); if(h>=0) PUSH(h,a); //read函数返回的数据大于0,数字入栈 else//读取到符号位 { you1=h;//检测到下一个符号位 you=TOP(b);//最上面符号的序号 if(s[you].x POP1(b); PUSH1(-2,b);//变为右括号 } } else if(you==6&&h==-1)//读取的和栈最上面的符号都是“=” { ans=POP(a); t=2; cout case 0:op1=POP(a);op2=POP(a);op3=op2+op1;PUSH(op3,a);t=1;break;//将计算所得的数重新压入堆栈 case 1:op1=POP(a);op2=POP(a);op3=op2-op1;PUSH(op3,a);t=1;break; case 2:op1=POP(a);op2=POP(a);op3=op2*op1;PUSH(op3,a);t=1;break; case 3:op1=POP(a);op2=POP(a);op3=op2/op1;PUSH(op3,a);t=1;break; case 5:t=0;break;//左括号直接省去,直接往后读一位,省略右括号 default: cout


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭