算法核心:

一般表达式都采用的中缀表达式,而中缀表达式不仅要依赖运算符优先级,还要处理括号。所以,对于中缀表达式,一般是先将其化作后缀表达式,在后缀表达式中只有操作符和运算符,而且越放在前面的运算符越先执行。

算法步骤:

1.将算术表达式转换为后缀表达式。先设置两个数组,一个是用于存放后缀表达式的res[]数组,另一个是用于当作栈使用用于存放运算符的Stack[]数组,每取一个字符:
(1)当遇到运算符时:
a.若该运算符的优先级比目前Stack[]栈顶的运算符高时,直接入栈;
b.若运算符的优先级没有Stack[]栈顶的运算符高时,则不断出栈,直到该运算符优先级比目前Stack[]栈顶的运算符高为止,对于出栈的字符都存于res[]数组。
(2)当遇到括号字符时:
a.若为左括号,则直接入栈;
b.若为右括号,则不断出栈,并将出栈的符号存于res[]中,直到出栈符号为左括号。
(3)当遇到数字字符时,则直接存于res[]数组。
最后,将栈中的所有字符依次出栈到res[]数组中去。
2.对得到的后缀表达式求值。依次从res[]的左到右处理字符串,每取一个字符:
(1)当字符为数字字符时,则进行入栈保存;
(2)当字符为运算符时,则进行出栈两次的操作,将出栈得到的两个数字进行相应的运算,并将结果进行入栈。
直到所有字符取完为止。

注意:(1)在res[]数组中,为了防止两个数字混淆在一起,会在两个数字中间加一个‘#’,如何保证每两个数之间都有‘#’呢?可以利用每两个数字之间一定有运算符的特点,每遇到一个运算符,就先在res[]中存一个‘#’;
(2)在对运算符设置优先级时要仔细,‘(’的优先级应该是最低的。

实例以及代码

char Stack[100]; //当作一个栈使用,存储运算符
int top=-1,k;
int rank[100];
//对运算符优先级进行量化
void InitialRank(){rank['(']=0;rank['+']=1;rank['-']=1;rank['*']=2;rank['/']=2;
}
//出栈入栈运算符
void Push(char a){top++;Stack[top]=a;
}char Pop(){char ch;ch=Stack[top];top--;return ch;
}
//接收输入数据
int Input(char c[]){int i=0;char ch;printf("简易计算器\n");printf("请输入表达式:");ch=getchar();while(ch!='\n'){c[i++]=ch;ch=getchar();}return i;
}
//转换为后缀表达式
void PostExpression(char c[],int n,char res[]){int i;char ch;for(i=0;i<n;i++) //遍历整个中缀表达式{if(c[i]=='(') //‘(’直接入栈Push(c[i]);else if(c[i]==')') //')'不断出栈,直到遇到‘(’{ch=Pop();while(ch!='('){res[k++]=ch;ch=Pop();}} else if(c[i]>='0'&&c[i]<='9')res[k++]=c[i];else {res[k++]='#';while(top>-1&&rank[c[i]]<=rank[Stack[top]])res[k++]=Pop();Push(c[i]);}}while(top>-1)res[k++]=Pop();
}
//后缀表达式求值
void Operation(char res[]){int i=0;int t[2],n=-1;while(i<k){if(res[i]>='0'&&res[i]<='9') //数字字符转数字{n++;t[n]=res[i]-48;i++;while(res[i]>='0'&&res[i]<='9'){t[n]=t[n]*10+res[i]-48;i++;}}else if(res[i]=='#')i++;else{switch(res[i]) //根据运算符进行运算{case '+':  t[n-1]=t[n]+t[n-1]; n--;break;case '-':  t[n-1]=t[n-1]-t[n]; n--;break;case '*':  t[n-1]=t[n]*t[n-1]; n--;break;case '/':  t[n-1]=t[n-1]/t[n]; n--;break;}i++;}}printf("运行结果为:%d",t[n]);
}
int main(){char c[20],res[20];int n;n=Input(c);InitialRank();PostExpression(c,n,res);Operation(res);return 0;
}

运行结果:

简易计算器(C语言实现)相关推荐

  1. 51单片机2位数简易计算器C语言实现

    今天是51单片机模块! 事实上,也是离不开C语言编程啦 适合手头上有51单片机且对硬件有兴趣的小伙伴们 这里推荐初学者(我自己就是哈哈哈)购买天祥电子51单片机开发板(TX-1C) 话不多说,上代码: ...

  2. c语言数码管加法程序怎么写,拜托大神写数码管与矩阵键盘结合设计简易计算器C语言的程序...

    我和你用的是一样的,给你一个我买板子送的矩阵程序 //4*4键盘检测程序,按下键后相应的代码显示在数码管上 #include sbit beep=P2^3; sbit dula=P2^6; sbit ...

  3. 51单片机简易计算器C语言程序,用51单片机制作的简单计算器程序

    三.程序源代码 #include <reg51.h>#include <intrins.h> #include <ctype.h> #include <std ...

  4. 简易计算器 (C语言)作业

    从Github下载 从CSDN下载 // // ViewController.h // SimpleCalculator // // Created by Mewlan Musajan on 11/2 ...

  5. 十位数连加 c语言,用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除....

    用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除. 用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除. 人气:435 ℃时间:2020-04-10 06:55:13 优质解答 ...

  6. c语言课程设计之简易计算器,简易计算器课程设计 帮忙写简单计算器课程设计...

    帮忙写简单计算器课程设计书繁华若真如一梦,过而无痕多好,人就不必失意,只当醉了一场,醒来仍过平淡的生活. 程序 #include #include //定义atlf函数 #include 简介下的 要 ...

  7. GO语言基础----简易计算器

    GO语言基础----简易计算器 该计算器可以执行两个数字和一个计算符号的计算. 例如,1+1,3*5,9/2- 代码实现: package mainimport("fmt")fun ...

  8. C语言练习 | 实现四则运算和单位换算的简易计算器

    作为C语言初学者,尝试完成了一个可以实现四则运算和单位换算的简易计算器,请多指教. 一.需求分析 1.四则运算: (1) 能识别用户输入的运算(加+.减.乘*.除/)表达式并计算,如:用户输入189+ ...

  9. c语言51单片机计算器,新基于51单片机的简易计算器

    <新基于51单片机的简易计算器>由会员分享,可在线阅读,更多相关<新基于51单片机的简易计算器(24页珍藏版)>请在人人文库网上搜索. 1.基于51单片机的简易计算器1.前言: ...

最新文章

  1. 只有这种AI芯片才能拯救人工智能?
  2. 中断描述符表IDT以及Linux内核IDT表的初始化的基本情况
  3. 密织“地网” 南充“试水”智慧安防
  4. mysql数据库优先_MySQL数据库配置文件之优先级
  5. 【OpenCV 例程200篇】75. Numpy 实现图像傅里叶变换
  6. jsp中forward与sendRedirect的区别
  7. 如何删除集合(数组)中指定的元素
  8. 小米财报:Q3营收537亿创新高 经调净利35亿超市场预期
  9. Linux下Qt的QPixmap加载图片无法显示的问题
  10. 今天写了个查看 ABAP 类层级的程序
  11. 马鞍数55c语言_c语言超全练习题(全面更新)
  12. 如何构建高效可信的持续交付能力,华为云有绝活!
  13. 【便签纸】记录一下对比excel列表的小工具代码
  14. 程序员的思维修炼读书笔记(二)
  15. 如何关掉ie浏览器的增强安全配置?
  16. 法向导数 格林第一公式
  17. 2021-09-05
  18. 空瓶换酒问题【一行代码】
  19. uiautomator2-App内操作之设备通用操作
  20. 用计算机管理人员档案属于数据处理,高校档案信息化建设的若干思考

热门文章

  1. 逻辑运算符:与,或,非,异或
  2. python中class什么意思_python – 这个代码中classmethod做了什么?
  3. 程序设计方法与技术——C语言 程序设计概述
  4. GA-LSTM的国内外研究现状
  5. 基于微信奶茶外卖点餐小程序系统设计与实现 开题报告
  6. 你真的知道Win 10中注销、睡眠、休眠的区别么?
  7. 什么是SSL协议,浅谈SSL协议。
  8. 京东mate10评论分析
  9. throw与throws的区别
  10. String类型转Long类型需要注意的问题