四则运算(C语言)


前言

学习使用C语言实现一些简单的四则运算 对于一些简单的四则运算,我们要知道先乘除后加减 在之前栈的学习中,了解到简单的四则运算就是利用栈来实现的,所以在这里我们使用栈来实现这个四则运算

想了解栈可以看这里


原理

在计算机中,任何一个表达式都是由操作数(operand),运算符(operator),界限符(delimiter)组成的。
其中操作数可以是常数,也可以是变量或者常量的标识符
运算符可以是算数运算符,关系运算符和逻辑运算符
界限符分为左右括号和标识表达式结束的结束符
在此我们仅讨论简单算术表达式的求值问题,假设在这种表达式中只含加,减,乘,除四则运算,所有的运算对象均为整型常量,表达式的结束符为#,即仅含符号+,-,*,/和#

规则如下:

  • 先乘除,后加减
  • 同级运算时先左后右
  • 先括号内,后括号外

设置两个栈,操作数栈(OPRD):存放处理表达式过程中的操作数
运算符栈(OPRT):存放处理表达式中的运算符。开始时先向栈底压入一个表达式的结束符#

计算机系统在处理表达式时,从左到右依次读出表达式中的各个符号(操作数或运算符),每读出一个符号后,根据运算规则做如下处理:

  • 假如读出的运算符的优先级高于运算符栈栈顶运算符的优先级,将其压入运算符栈,读取下一个符号。
  • 假如读出的运算符优先级等于运算符栈栈顶运算符的优先级,说明左右括号相遇,将栈顶运算符退栈即可。
  • 假如读出的运算符优先级低于运算符栈栈顶运算符的优先级,则从操作数栈连续退出两个操作数,从运算符栈中退出一个运算符,然后做相应运算,并将运算结果压入操作数栈,不读入下一个符号。
  • 假如读出的是表达式的结束符“#”,且运算符栈栈顶的运算符也是“#”,则表达式处理结束,最后的表达式的计算结果在操作数栈的栈顶位置。

思路

  • 设置两个栈,用来存储数字和计算符号
  • 计算函数来计算优先级正确时两个相邻数字的计算结果
  • 比较函数比较两个相邻运算符优先级
  • 在读入操作数的各位数时,需要注意转化为十进制数。

代码

#include <stdio.h>
#include <string.h>
int Compare(char str) {
    if (str == '#') {
        return 0;
    } else if (str == '+' || str == '-') {
        return 1;
    } else if (str == '*' || str == '/') {
        return 2;
    } else {
        //输入符号有误时返回-1
        return -1;
    }
}
int Calcution(int a, char str, int b) {
    int x = 0;
    if (str == '+') {
        x = a + b;
    } else if (str == '-') {
        x = a - b;
    } else if (str == '*') {
        x = a * b;
    } else if (str == '/') {
        x = a / b;
    }
    return x;
}
int main(int argc, const char * argv[]) {
    int numberStack [100] = {0};
    int numberTop = -1;
    char symbolStack [100] = {'#'};
    int symbolTop = 0;
    char str[100];
    int flag = -1;
    scanf("%s", str);
    int x = 0;
    int length = (int)strlen(str);
    str[length] = '#';
    length = length + 1;
    for (int i = 0; i < length;) {
        if (str[i] >= '0' && str[i] <= '9') {
            x *= 10;
            x += str[i++] - '0';
            flag=1;
        } else {
            if(flag==1) {
                numberStack[++numberTop] = x;
             x = 0;
             flag=-1;
            }
            if (Compare(symbolStack[symbolTop]) < Compare(str[i])) {
                symbolStack[++symbolTop] = str[i++];
            } else {
                int b = numberStack[numberTop--];
                int a = numberStack[numberTop];
                numberStack[numberTop] = Calcution(a, symbolStack[symbolTop], b);
                symbolTop--;
                if (str[i] == '#' && symbolTop == 0) {
                    break;
                }
            }
        }
    }
    printf("%d\n", numberStack[numberTop]);
}

结果:
结果展示

  • 24
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河丘壑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值