【C语言】—— 实现简易四则运算

实现简易四则运算表达式

前言

在我们使用计算器进行简单的加减乘除运算的时候,需要注意很多问题,最重要的是乘除法的算数优先级和加减法是不同的,如果在一连串连续输入的时候,我们要如何做到正确解答问题呢?

解题思路

在面对这个问题的时候,我首先想到的方法是将数据和运算符,分别存入两个数组里,然后遍历运算符数组,将其中的乘和除筛选出来进行运算,最后再进行加减运算。

以上方法其实可以解决这个问题,但是时间复杂度过高,有点暴力的感觉,利用栈的方法就可以解决这个问题,栈的特殊处理方式,先进后出,由此我们又能想到,使用两个栈利用它特殊的处理方式来实现简单的四则运算。

第一个栈用来存储数据,将你输入的字符串中的所有的数字都存入这个栈中,方便后续的使用,另一个栈用来存储符号,需要考虑怎么才能实现先乘除后加减的特殊运算顺序,此时我们可以为其特殊的符号赋予不同的优先级,用数字来代表其优先级,越大的就越高,将我们输入的字符串中的符号一个个通过比较压入栈中,若优先级大于或等于栈顶符号那么压入栈中,若优先级小于栈顶符号,则取数字栈中两个元素,以及符号栈栈顶进行运算,并将结果存入栈中。最终数据栈的唯一一个数值就是最终的得数。

假设我们要计算1×2+3×4这个式子:
我们来模拟一下这个步骤:
在这里插入图片描述
然后第二步:
在这里插入图片描述

第三步:
在这里插入图片描述
最后一步完成加法运算即可。

全部代码如下:

#include <stdio.h>
#include <string.h>
int Calculation(int a, char c, int b);
void ScanfData();
int Compare(char ch);
int main() {
    
    
	ScanfData();
	return 0;
}

int Calculation(int a, char c, int b) {
    
    
	if (c == '+') {
    
    
		return a + b;
	} else if (c == '-') {
    
    
		return a - b;
	} else if (c == '*') {
    
    
		return a * b;
	} else if (c == '/') {
    
    
		return a / b;
	} else {
    
    
		return -1;
	}
}
void ScanfData() {
    
    
	int numStack[100] = {
    
    0};
	int numTop = -1;	
	char symStack[100] = {
    
    '='};
	int symTop = 0;	
	char str[100];
	int flag = -1;
	scanf("%s", str);
	int x = 0;
	int length = (int)strlen(str); 
	int i = 0;
	while (i < length) {
    
    
        if (str[i] >= '0' && str[i] <= '9') {
    
    
            x = x * 10 + (str[i++] - '0');
            flag = 1;
        } else {
    
    
            if (flag == 1) {
    
    
                numStack[++numTop] = x;
                x = 0;
                flag = -1;
            }
            if (Compare(symStack[symTop]) < Compare(str[i])) {
    
    
                symStack[++symTop] = str[i++];
            } else {
    
    
                int b = numStack[numTop--];
                int a = numStack[numTop--];
                numStack[++numTop] = Calculation(a, symStack[symTop], b);
                symTop--;
                if (str[i] == '=' && symTop == 0) {
    
    
                    break;
                }
            }
        }
    }
    printf("%d", numStack[numTop]);
}
int Compare(char c) {
    
    
	if (c == '=') {
    
    
		return 0;
	} else if (c == '+' || c == '-') {
    
    
		return 1;
	} else if (c == '*' || c == '/') {
    
    
		return 2;
	} else {
    
    
		printf("error");
		return -1;
	}
}

栈和队列简单练习题:

在这里插入图片描述

char* removeDuplicates(char* s) {
    
    
    int len = strlen(s);
    int i, j = 0;
    char *q = (char *)malloc(sizeof(char) * len);
    for (i = 0; i < len; i++) {
    
    
    	q[j] = s[i];
    	if (j > 0) {
    
    
    		if (q[j] == q[j - 1]) {
    
    
    			j = j - 2;
			}
		}
		j++;
	}
	q[j] = '\0';
	return q;
}

在这里插入图片描述

int countStudents(int* students, int studentsSize, int* sandwiches, int sandwichesSize){
    
    
    int stu0 = 0, stu1 = 0;
	int i;
	for (i = 0; i < studentsSize; i++) {
    
    
		if (students[i] == 0) {
    
    
			stu0++;
		} else {
    
    
			stu1++;
		}
	} 
	for (i = 0; i < sandwichesSize; i++) {
    
    
		if (sandwiches[i] == 0) {
    
    
			if (stu0 == 0) {
    
    
				return studentsSize - i;
			} else {
    
    
				stu0--;
			}
		} else {
    
    
			if (stu1 == 0) {
    
    
				return studentsSize - i;
			} else {
    
    
				stu1--;
			}
		}
	}
	return 0;
}

在这里插入图片描述

int timeRequiredToBuy(int* tickets, int ticketsSize, int k){
    
    
    int i = 0, count = 0;
    if (tickets[k] == 0) {
    
    
    	return 0;
	}
	while (i <= k) {
    
    
		for (int j = 0; j < ticketsSize; j++) {
    
    
			tickets[j]--;
			if (tickets[j] >= 0) {
    
    
				count++;
			}
			if (tickets[k] == 0) {
    
    
				return count;
			}
		}
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_62386635/article/details/126940247
今日推荐