基于栈的中缀算术表达式求值c完整代码,当只有=时,输出结束
时间: 2024-11-22 17:47:38 浏览: 65
基于栈的中缀算术表达式求值通常涉及到逆波兰表示法(RPN,也称为后缀表示法),它将运算符放在操作数之后,避免了括号带来的复杂性。下面是一个简单的C语言代码示例,用于处理只包含加减等于的中缀表达式,并在遇到等号(=)时停止计算:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TOKENS 100
#define OPERATORS {"+", "-", "="}
typedef struct {
char op;
int precedence;
} Operator;
void process_expression(char* expression) {
char tokens[MAX_TOKENS];
int token_count = 0;
// 分割输入表达式为字符数组
for (int i = 0; expression[i] != '\0'; ++i) {
if (expression[i] == ' ') continue;
tokens[token_count++] = expression[i];
}
tokens[token_count] = '\0';
stack_t values = {0}; // 数组栈
stack_t operators = {0};
Operator current_op = {'\0', -1};
for (int i = 0; tokens[i]; ++i) {
if (isdigit(tokens[i])) {
// 如果是数字,压入数值到值栈
while (values.top && isdigit(values.top)) {
add_to_stack(&operators, ¤t_op);
add_to_stack(&values, tokens + i);
i += 1;
}
add_to_stack(&values, tokens + i);
i += 1;
} else if (tokens[i] == '=') {
// 遇到等号,跳出循环
break;
} else if (tokens[i] == '+' || tokens[i] == '-') {
// 遇到运算符,比较优先级并压入栈
current_op.op = tokens[i];
current_op.precedence = get_precedence(current_op.op);
while (!stack_empty(&operators) && get_precedence(operators.top.op) >= current_op.precedence) {
add_result(&values);
pop_from_stack(&operators);
}
push_to_stack(&operators, ¤t_op);
}
}
// 处理剩余的运算符
while (!stack_empty(&operators)) {
add_result(&values);
pop_from_stack(&operators);
}
printf("Result: %d\n", values.top); // 输出最终结果
}
// 其他辅助函数如获取优先级、判断空栈等,这里省略
int main() {
char expression[] = "1 + 2 * 3 = 4";
process_expression(expression);
return 0;
}
```
这个程序首先将中缀表达式分割成单个字符,然后遍历每个字符,处理数字、运算符和等号。当遇到等号时,会立即停止计算。注意,这只是一个简化版本,实际应用中还需要处理更复杂的运算符组合和错误检查。
阅读全文