栈实现四则运算
栈实现四则运算
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义运算符优先级
int precedence(char op) {if (op == '+' || op == '-')return 1;if (op == '*' || op == '/')return 2;if (op == '^')return 3;return 0;
}// 执行基本运算
int applyOp(int a, int b, char op) {switch (op) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;case '^':return (int)pow(a, b);}return 0;
}// 计算表达式
int evaluate(char* tokens) {int i;// 栈用于存储操作数int values[100];int valuesTop = -1;// 栈用于存储操作符char ops[100];int opsTop = -1;//负号的处理int flag =1;for (i = 0; i < strlen(tokens); i++) {// 如果当前字符是空格,跳过if (tokens[i] == ' ')continue;else if ((i==0 && tokens[i]=='-')|| !isdigit(tokens[i-1])&& tokens[i]=='-'){flag=-1;}// 当前字符是数字, 推入值堆栈else if (isdigit(tokens[i])) {int val = 0;// 处理多位数while (i < strlen(tokens) && isdigit(tokens[i])) {val = (val * 10) + (tokens[i] - '0');i++;}values[++valuesTop] = val*flag;flag = 1;i--;}// 当前字符是左括号, 推入ops栈else if (tokens[i] == '(') {ops[++opsTop] = tokens[i];}// 当前字符是右括号else if (tokens[i] == ')') {while (opsTop != -1 && ops[opsTop] != '(') {int val2 = values[valuesTop--];int val1 = values[valuesTop--];char op = ops[opsTop--];values[++valuesTop] = applyOp(val1, val2, op);}// 弹出左括号opsTop--;}// 当前字符是运算符else {while (opsTop != -1 &&precedence(ops[opsTop]) >= precedence(tokens[i])) {int val2 = values[valuesTop--];int val1 = values[valuesTop--];char op = ops[opsTop--];values[++valuesTop] = applyOp(val1, val2, op);}ops[++opsTop] = tokens[i];}}// 处理剩余的操作符while (opsTop != -1) {int val2 = values[valuesTop--];int val1 = values[valuesTop--];char op = ops[opsTop--];values[++valuesTop] = applyOp(val1, val2, op);}return values[valuesTop];
}int main() {char expression[100];printf("请输入表达式(以=结束):");fgets(expression, sizeof(expression), stdin);// 移除换行符和等号int len = strlen(expression);if (expression[len - 1] == '\n')expression[len - 1] = '\0';if (expression[len - 1] == '=')expression[len - 1] = '\0';// 计算表达式int result = evaluate(expression);printf("结果为:%d\n", result);return 0;
}