如不清楚算法思路,请点下方的链接:
算法思路

#include<stdio.h>
#include<stdlib.h>/*数据栈*/
struct shuju {int data[100];int top;
};/*符号栈*/
struct fuhao {char symbol[100];int top;
};void InitOperateNum(struct shuju *StackNum)
{StackNum->top = -1;
}void InitOperateSymbol(struct fuhao *StackSymbol)
{  StackSymbol->top = -1;
}/*存入数据栈*/
void Inshuju(struct shuju *StackNum, int num)
{StackNum->top ++;StackNum->data[StackNum->top] = num;
}/*存入符号栈*/
void Infuhao(struct fuhao *StackSymbol, char ch)
{StackSymbol->top ++;StackSymbol->symbol[StackSymbol->top] = ch;
}/*读取数据栈*/
int Randshuju(struct shuju *StackNum)
{return StackNum->data[StackNum->top];
}/*读取符号栈*/
char Randfuhao(struct fuhao *StackSymbol)
{return StackSymbol->symbol[StackSymbol->top];
}/*从数据栈取出数据*/
int Putshuju(struct shuju *StackNum)
{int x;x = StackNum->data[StackNum->top];StackNum->top --;return x;
}/*从符号栈取出符号*/
char Putfuhao(struct fuhao *StackSymbol)
{char c;c = StackSymbol->symbol[StackSymbol->top];StackSymbol->top --;return c;
}/*符号优先级判断*/
int judge(char ch) {if(ch == '(') {return 1; }if(ch == '+' || ch == '-') {return 2;}else if(ch == '*' || ch == '/') {return 3;}else if(ch == ')') {return 4;}
}/*四则运算*/
int Math(int v1, int v2, char c)
{int sum;switch(c) {case '+' : {sum = v1 + v2;break;}case '-' : {sum = v1 - v2;break;}case '*' : {sum = v1 * v2;break;} case '/' : {sum = v1 / v2;break;}}return sum;
}int main()
{struct shuju data;struct fuhao symbol;InitOperateNum(&data);InitOperateSymbol(&symbol);int i, t, sum, v1, v2;char c;i = t = sum = 0;char v[100] = {0};char *str = (char *)malloc(sizeof(char)*200);while((c = getchar()) != '\n') {str[i] = c;i ++;}str[i] = '\0';for(i = 0; str[i] != '\0'; i ++) {if(i == 0 && str[i] == '-') {v[t++] = str[i];}else if(str[i] == '(' && str[i+1] == '-') {i ++;v[t++] = str[i++];while(str[i] >= '0' && str[i] <= '9') {v[t] = str[i];t ++;i ++;}Inshuju(&data, atoi(v));while(t > 0) {v[t] = 0;t --;}if(str[i] != ')') {i --;Infuhao(&symbol, '(');}}else if(str[i] >= '0' && str[i] <= '9') {while(str[i] >= '0' && str[i] <= '9') {v[t] = str[i];t ++;i ++;}Inshuju(&data, atoi(v));while(t > 0) {v[t] = 0;t --;}i --;}else {if(symbol.top == -1) {        //如果符号栈没有元素,直接把符号放入符号栈 Infuhao(&symbol, str[i]);}else if(judge(str[i]) == 1) { //如果此符号是'(',直接放入符号栈 Infuhao(&symbol, str[i]);}else if(judge(str[i]) == 2) { //如果此符号是'+'或'-',判断与栈顶符号是优先级 if(judge(Randfuhao(&symbol)) == 1) { //如果栈顶符号是'(',放入符号栈 Infuhao(&symbol, str[i]);}else if(judge(Randfuhao(&symbol)) == 2) { //如果栈顶符号是'+'或'-',则出栈运算 while(symbol.top >= 0 && data.top >= 1) { //循环出栈v2 = Putshuju(&data);v1 = Putshuju(&data);sum = Math(v1, v2, Putfuhao(&symbol));Inshuju(&data, sum); //将运算结果压入数据栈 }Infuhao(&symbol, str[i]); //新符号进栈 }else if(judge(Randfuhao(&symbol)) == 3) { //如果栈顶符号是'*'或'/',则进符号栈 while(symbol.top >= 0 && data.top >= 1) { //循环出栈v2 = Putshuju(&data);v1 = Putshuju(&data);sum = Math(v1, v2, Putfuhao(&symbol));Inshuju(&data, sum); //将运算结果压入数据栈 }Infuhao(&symbol, str[i]); //新符号进栈 }/*栈顶符号不可能是')',故不做判断*/ }else if(judge(str[i]) == 3) { //如果此符号是'*'或'/',则判断与栈顶符号是优先级if(judge(Randfuhao(&symbol)) == 1) { //如果栈顶符号是'(',放入符号栈 Infuhao(&symbol, str[i]);}else if(judge(Randfuhao(&symbol)) == 2) { //如果栈顶符号是'+'或'-',则进符号栈Infuhao(&symbol, str[i]); //新符号进栈}else if(judge(Randfuhao(&symbol)) == 3) { //如果栈顶符号是'*'或'/',则出栈运算 while(symbol.top >= 0 && data.top >= 1) { //循环出栈v2 = Putshuju(&data);v1 = Putshuju(&data);sum = Math(v1, v2, Putfuhao(&symbol));Inshuju(&data, sum); //将运算结果压入数据栈 }Infuhao(&symbol, str[i]); //新符号进栈}}else if(judge(str[i]) == 4) { // 如果此符号是')',则出栈运算直到遇到'('do { //循环出栈直到遇到'('v2 = Putshuju(&data);v1 = Putshuju(&data);sum = Math(v1, v2, Putfuhao(&symbol));Inshuju(&data, sum); //将运算结果压入数据栈 }while(judge(Randfuhao(&symbol)) != 1);Putfuhao(&symbol); //括号内运算结束后使'('出栈 }         }}free(str); //释放内存空间while(symbol.top != -1) {v2 = Putshuju(&data);v1 = Putshuju(&data);sum = Math(v1, v2, Putfuhao(&symbol));Inshuju(&data, sum);  }printf("%d", data.data[0]);return 0;
}

C语言实现科学计算器相关推荐

  1. linux 计算器 c语言,大神教你如何用C语言实现科学计算器

    原标题:大神教你如何用C语言实现科学计算器 用C实现的科学计算器 使用C语言写的科学计算器,可以实现四则运算.三角函数运算.指对数运算:优先级正确:能智能屏蔽空格,能识别输入错误和运算错误,能实现继续 ...

  2. C语言实现科学计算器的加减乘除平方开放运算

    本程序可以对 "输入的表达式" 和 "从文件里面读入的表达式" 进行运算 并且支持对负号的处理 代码运行时有一个警告信息 ,但是不影响运行和最终的结果.不知道问 ...

  3. C语言科学计算器思路,大神教你如何用C语言实现科学计算器

    i++; *len=i; return temp; } /*功能:翻译操作数 * 如果运算符非法,则返回0,合法则返回非零标志 */ int translateopt(char *p,int *len ...

  4. c语言程序算法思想,C语言实现科学计算器(算法思想)

    程序设计目的是用户可以输入中缀表达式,回车后计算出结果. 首先要知道中缀表达式如何转换成后缀(前缀)表达式,中缀表达式是人容易理解的表达式,而对计算机来说,计算中缀表达式是很困难的.所以我们先把中缀表 ...

  5. c语言编程计算器开平方,用c语言实现科学计算器要求有计算器界面 可以加减乘除平方开方...

    满意答案 LADYgemen 2019.07.02 采纳率:58%    等级:9 已帮助:568人 #include "stdafx.h" #define STACK_INIT_ ...

  6. 基于C语言、线性表的 二、八、十、十六进制转换 及 加运算、左右移位运算、乘法运算 的科学计算器设计

    源代码见资源:https://download.csdn.net/download/weixin_44410704/19840894 一.需求分析 1.1 设计题目 题目:科学计算器 用C语言实现十进 ...

  7. c语言计算器程序代码 链栈,【C语言】简易科学计算器源代码(链栈应用)(原创).doc...

    [C语言]简易科学计算器源代码(链栈应用)(原创) 用到的是算符优先法的思想,现摘自严蔚敏的数据结构(C语言版)的3.2.5章来详细说明算符优先法的思想: (摘抄结束) 我给出的计算器功能有:支持欧拉 ...

  8. 小数阶乘怎么用c语言计算器,自编科学计算器 支持多次方 多次开放 阶乘 部分数学函数...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /**************************************************************************** ...

  9. 科学计算机怎么编程玩,如何通过可编程科学计算器在另一个设备中运行本机MFP语言编写的...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 MFP语言的一个重要功能就是通过call ... endcall语句实现对并行计算的支持.MFP语言实现多线互不干扰并行计算的基本原理是采用沙盒机制.每一 ...

最新文章

  1. 剑指offer:面试题27. 二叉树的镜像
  2. SAP PM工作清单管理
  3. linux下c md5函数
  4. linux开发需要学习什么,linux开发需要掌握哪些知识?
  5. 运用begin和end截取值
  6. 源码安装mysql5.1.51
  7. Centos7 使用Docker MySQL部署_01
  8. 安装SQL Server出现在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke的错误解决办法...
  9. 学python能干什么工作-什么是Python?学完之后能做哪些工作?
  10. 盗墓笔记android,盗墓笔记手游下载
  11. day2_python年会抽奖游戏
  12. C++获取、设置鼠标坐标并移动鼠标
  13. GOCI数据批量下载
  14. linux mysql stop 报错_mysql linux上安装使用
  15. 京东格力空调和专卖店有什么区别?
  16. CentOS7无法解压7za包,解决办法!!!
  17. 精选6个超实用的Word技巧,每一个大有用处!
  18. 关于Visio的一些使用技巧
  19. 2020/7/6期末PTA
  20. 读取文本文件的最后n行

热门文章

  1. 1、IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)
  2. 区块链 web3.0 Metamask
  3. suricata 命令
  4. 惠普179fnw打印机使用说明_惠普179fnw驱动下载-hp179fnw打印机驱动v1.14 官方版 - 极光下载站...
  5. 用科技赋能教育创新与重构 华为将教育信息化落到实处
  6. 使用python3爬去360图片
  7. 高德地图获取当前屏幕中心点的经纬度
  8. 自然图像抠图/视频抠像技术发展情况梳理
  9. 【物联网03】 CentOS7编译EMQ源码
  10. Unity Shader 卡通渲染 (五):仿日式赛璐珞风格 Shader(顶点外扩描边)