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

#include

#include

#include

struct Numerical

{

double value;

struct Numerical *next;

};

struct Symbol

{

char c;

struct Symbol *next;

};

void Push_Numerical(struct Numerical **top,double value)

{

struct Numerical *p = *top;

(*top = (struct Numerical*)malloc(sizeof (struct Numerical)))->next = p;

(*top)->value = value;

}

void Push_Symbol(struct Symbol **top,char c)

{

struct Symbol *p = *top;

(*top = (struct Symbol*)malloc(sizeof (struct Symbol)))->next = p;

(*top)->c = c;

}

double Pop_Numerical(struct Numerical **top)

{

struct Numerical *p = *top;

double n = (*top)->value;

*top = (*top)->next;

free(p);

return n;

}

char Pop_Symbol(struct Symbol **top)

{

struct Symbol *p = *top;

char c = (*top)->c;

*top = (*top)->next;

free(p);

return c;

}

int priority(char c)

{

switch (c)

{

case *+*:

case *-*:

return 1;

case ***:

case */*:

return 2;

default:

return 10;

}

}

double calculate(char c,double l,double g)

{

switch (c)

{

case *+*:

return l + g;

case *-*:

return l - g;

case ***:

return l * g;

case */*:

return l / g;

}

}

int main (void)

{

struct Numerical *Numerical_stack = NULL;

struct Symbol *Symbol_stack = NULL;

double n;

int last_number = 0; //上一个读取的是不是数则值为假,如果上一个读取的是数,下一个只能是读取字符

char pop_c,c;

puts("表达式计算器\n\n");

puts("1.作者很笨,写出来的程序智商很低,因此它是一个很单纯的计算器,请不要用复杂的算数表达式为难它\n");

puts("2.因为作者忘记了除数不能为0,所以并没有做特殊处理,请不要故意除以0\n");

puts("3.当你输入错误的表达式,程序会采用崩溃的方式提示你的输入有误,请重启程序重新输入\n");

puts("4.支持的运算符:英文状态下:‘(’‘)’‘+’‘-’‘*’‘/’\n");

puts("程序有些BUG,某些表达式会得出错误的结果,希望大家能够指出\n作者:642985327");

system("pause");

system("cls");

begin:

if((c = getchar()) == *-*)Push_Numerical(&Numerical_stack,0); //如:-(5)第一个字符被压栈双目运算数字栈空导致错误

ungetc(c,stdin);

while ((c = getchar())!= *\n*) //读取表达式内容,在转换后缀表达式的同时进行运算

{

ungetc(c,stdin);

if (last_number == 0 && scanf("%lf",&n))

{

Push_Numerical(&Numerical_stack,n);

last_number = 1;

}

else

{

char a = getchar();

if ((c == *+* || c == *-* ) && c != a && last_number != 1) //防止scanf吃掉正负号导致程序错误计算,如果scanf勿吃掉了计算用的正负号则仍回输入流

ungetc(a,stdin);

else

c=a;

if ((c) == *)*)

{

while ((pop_c = Pop_Symbol(&Symbol_stack)) != *(*)

{

double g = Pop_Numerical(&Numerical_stack);

double l = Pop_Numerical(&Numerical_stack);

Push_Numerical(&Numerical_stack,calculate(pop_c,l,g));

}

}

else if (Symbol_stack == NULL || c == *(* || Symbol_stack->c ==*(* || priority(Symbol_stack->c) < priority(c))

{

Push_Symbol(&Symbol_stack,c);

}

else

{

while (Symbol_stack->c != *(*)

{

pop_c = Pop_Symbol(&Symbol_stack);

double g = Pop_Numerical(&Numerical_stack);

double l = Pop_Numerical(&Numerical_stack);

Push_Numerical(&Numerical_stack,calculate(pop_c,l,g));

if (Symbol_stack == NULL || priority(Symbol_stack->c) < pop_c || Symbol_stack->c == *(*)break;

}

Push_Symbol(&Symbol_stack,c);

}

if (c != *)*)last_number = 0; //除了在读到*)*的情况,读到其他符号,下一次都能尝试读取一个数字

}

}

while (Symbol_stack != NULL) //剩余符号全部弹出栈参与运算

{

double g = Pop_Numerical(&Numerical_stack);

double l = Pop_Numerical(&Numerical_stack);

Push_Numerical(&Numerical_stack,calculate(Pop_Symbol(&Symbol_stack),l,g));

}

printf("%g\n",Pop_Numerical(&Numerical_stack));

goto begin

return 0;

}

c语言变量表达式计算器,C语言表达式计算器~相关推荐

  1. c语言变量加常量,C语言(二)---常量与变量(示例代码)

    一.进制 1.1 二进制 1.1 简介 二进制数据是用0和1两个数码来表示的数.它的基数是2,进位规则是"逢二进1",借位规则是"借一当二".当前的计算机系统使 ...

  2. c语言变量定义数组,C语言中数组的定义和使用

    一.1.一维数组的定义: 类型说明符 数组名[常量表达式];    注意:常量表达式包括常量与符号常量,不能包含变量. 2.一维数组的引用: 数组名[下标]; 3.一维数组的初始化: a.在定义数组时 ...

  3. python语言变量名规则_python语言变量命名规则

    Python语言变量命名规则 变量名只能包含字母.数字和下划线.(推荐学习:Python视频教程) 变量名可以字母或下划线开头,但不能以数字开头.例如,可将变量命名为message_1,但不能将其命名 ...

  4. C语言变量初始化作用,C语言变量初始化

    C语言变量初始化教程 如果是定义的 因此,在 C 语言中,一个很好的习惯就是在定义变量的同时,给变量初始化,也就是给变量一个默认值. C语言变量初始化详解 语法 type varname = valu ...

  5. c语言 变量 定义 使用,C语言为什么要规定对所用到的变量要“先定义,后使用”...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 int a=10; 以上一句话对变量a进行了声明,定义以及初始化 extern int a; 以上一句话仅仅对变量a进行了声明,将a的链接属性设置为ext ...

  6. linux c语言变量地址类型,C语言基础知识:访问内存地址的方法

    汇编语言寄存器间接寻址方法 #define GPJ0CON0xE0200240 ldr r0, =GPJ0CON //把地址值赋给寄存器r0,从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断 ...

  7. 无效的变量名c语言,变量方法用法 _C语言-w3school教程

    C语言 的 变量 变量是内存位置的名称.它用于存储数据.其值可以更改,可以重复使用多次. 它是通过符号表示内存位置的方法,以便可以容易识别. 我们来看一下声明一个变量的语法: type variabl ...

  8. c语言变量名下表,C语言变量名命名规则

    一.程序风格: 1.严格采用阶梯层次组织程序代码: 各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行. 要求相匹配的大括号在同一列,对继行则要求再缩进4格.例如: 2.提示信息字 ...

  9. GO语言变量和常量、语言控制语句流程

    1.算术运算符 (比较简单,可以跳过) +  添加两个操作数 A+B - 从第一个操作数中减去第二个操作数 A-B / 将分子除分母 % 模数运算符,整数除法的余数 B%A ++ 增加(递增)运算符, ...

  10. c语言变量类型double,C语言double数据类型介绍、示例和应用经验

    1.浮点数的概念 浮点数也称小数或实数.例如,0.0.75.0.4.023.0.27.-937.198 都是合法的小数. C语言中采用float和double关键字来定义小数,float称为单精度浮点 ...

最新文章

  1. 计算机基础知识自考真题,自考《计算机应用基础》基础试题
  2. python conn_python中conn是什么
  3. Virtools学习(七)—2D Picking
  4. vscode更改插件路径_用好这7个 VS Code 插件,效率蹭蹭涨!
  5. android apk签名工具_Android 应用修改为系统签名的方法(macOS)
  6. MYSQL数据库性能调优之六:备份
  7. 多租户数据中心该如何布线?
  8. 微信读书android换到ios,Android 微信读书本周推荐传送带列表实现
  9. java 监听 变量_[Java学习小记]使用PropertyChangeSupport来监听变量的变化
  10. 转载]SA权限九种上传方法
  11. php mvc 路由,PHP MVC框架路由学习笔记
  12. Airflow集成在线编写创建dag的插件
  13. Android 插件化和热修复知识梳理
  14. 显卡虚拟化--最强实践
  15. C语言数字图像处理---1.6图像亮度对比度调节
  16. Python Web 框架-Django day06
  17. html thead作用,html元素thead标签的使用方法及作用
  18. 中文搜索引擎2010Q2市场份额
  19. Linux命令整理(二)
  20. 【SaltStack官方版】—— returners——返回器

热门文章

  1. n9009+android+4.4.2,三星N9009 (Galaxy Note 3 电信版 Android 4.4)ROOT教程,一键获取ROOT权限...
  2. 服装尺寸 html,服装尺寸表
  3. ZooKeeper系列:Leader选举
  4. sourcetree添加gitignore不生效解决方案
  5. 计算机无法开机如何读u盘启动,无法开机u盘装系统教程
  6. IOS10上崩溃错误“View has lost track of its superview, most likely through unsupported use of CALayer”解决方案
  7. 山重水复疑无路,最快下降问梯度(深度学习入门系列之七)
  8. Python案例1—人民币与美元的汇率兑换V_5.0
  9. 软件工程师的职业道德与修养
  10. 台式电脑一般价钱多少_一般普通台式电脑价格多少为好?