表达式求值数据结构怎样用c语言的代码实现
时间: 2024-10-11 17:06:07 浏览: 38
C语言数据结构算法-简单表达式求值(支持计算负数及小数)
在C语言中,表达式求值通常涉及到递归或栈的数据结构来处理嵌套的操作。这里我们可以简单地通过栈来模拟这个过程。下面是一个简单的例子,展示了如何使用栈来解析并计算基本的算术表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char op; // 运算符
int num; // 整数值
} Token;
int isNumber(char s[], int i) {
while (i < strlen(s) && s[i] >= '0' && s[i] <= '9')
i++;
return i - 1;
}
Token getToken(char exp[], int &i) {
if (exp[i] == '(')
return {')', 0}; // 如果遇到左括号,返回右括号作为占位符
else if (isdigit(exp[i]))
return {0, atoi(&exp[i])}; // 遇到数字,获取其整数值
else if (isalpha(exp[i])) // 非空格字符视为运算符
return {exp[i++], 0}; // 取得运算符,跳过它
else
return {0, 0}; // 遇到空格或其他非有效字符,返回无效标志
}
double applyOp(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return (double)a / b;
default: return 0;
}
}
double evaluateExpression(char* exp) {
int i = 0;
Stack<Token> stack;
double result = 0;
while (i < strlen(exp)) {
Token token = getToken(exp, i);
if (token.op == 0) { // 数字
result = applyOp(result, token.num, 0); // 先把当前结果入栈
stack.push(token);
} else if (token.op == ')') { // 遇到右括号
while (!stack.isEmpty() && stack.top().op != '(')
result = applyOp(stack.pop().num, result, stack.top().op);
stack.pop(); // 弹出左括号
} else { // 运算符
while (!stack.isEmpty() && precedence(token.op) <= precedence(stack.top().op))
result = applyOp(stack.pop().num, result, stack.top().op);
stack.push(token);
}
}
// 最后处理剩余的运算符和数字
while (!stack.isEmpty())
result = applyOp(stack.pop().num, result, stack.top().op);
return result;
}
// 值得注意的是,这里`precedence`函数没有给出,因为它取决于具体的优先级规则,你需要根据实际需求自定义。
阅读全文