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