实现简易四则运算表达式
前言
在我们使用计算器进行简单的加减乘除运算的时候,需要注意很多问题,最重要的是乘除法的算数优先级和加减法是不同的,如果在一连串连续输入的时候,我们要如何做到正确解答问题呢?
解题思路
在面对这个问题的时候,我首先想到的方法是将数据和运算符,分别存入两个数组里,然后遍历运算符数组,将其中的乘和除筛选出来进行运算,最后再进行加减运算。
以上方法其实可以解决这个问题,但是时间复杂度过高,有点暴力的感觉,利用栈的方法就可以解决这个问题,栈的特殊处理方式,先进后出,由此我们又能想到,使用两个栈利用它特殊的处理方式来实现简单的四则运算。
第一个栈用来存储数据,将你输入的字符串中的所有的数字都存入这个栈中,方便后续的使用,另一个栈用来存储符号,需要考虑怎么才能实现先乘除后加减的特殊运算顺序,此时我们可以为其特殊的符号赋予不同的优先级,用数字来代表其优先级,越大的就越高,将我们输入的字符串中的符号一个个通过比较压入栈中,若优先级大于或等于栈顶符号那么压入栈中,若优先级小于栈顶符号,则取数字栈中两个元素,以及符号栈栈顶进行运算,并将结果存入栈中。最终数据栈的唯一一个数值就是最终的得数。
假设我们要计算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;
}