前言
学习使用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]);
}
结果: