四则运算(C语言)

文章目录

  • 前言
  • 原理
  • 思路
  • 代码


前言

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

想了解栈可以看这里


原理

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

规则如下:

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

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

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

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

思路

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

代码

#include 
#include 
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]);
}

结果:
四则运算(C语言)_第1张图片

你可能感兴趣的:(C,c语言,开发语言)