键盘输入一个含有括号的四则运算表达式,可能含有多余的括号,编写整理该表达 去掉所有多余的括号,元表达式中所有变量和元素安抚相对位置不变并且保持与原表达式等价的C语言代码
时间: 2024-10-20 13:04:54 浏览: 91
在C语言中,处理这种含有括号的四则运算表达式的简化任务通常需要借助栈数据结构来辅助。这里是一个基本的算法思路:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// 定义操作符优先级
enum { PLUS = 1, MINUS = 2, MUL = 3, DIV = 4 };
typedef struct {
int value;
bool is_open; // 检查是否为左括号
} Token;
bool is_number(char c) {
return '0' <= c && c <= '9';
}
Token read_token(char* str, char** end) {
Token token;
*end = str;
if (is_number(*str)) {
token.value = 0;
while (isdigit(**end)) {
token.value = token.value * 10 + (*end - str)[0] - '0';
++*end;
}
} else if (*str == '(' || *str == ')') {
token.is_open = *str == '(';
++*end;
} else {
printf("Invalid character in expression\n");
exit(1);
}
return token;
}
void simplify_expression(char* expr) {
char* start = expr;
stack<Token> tokens;
for (char* current = expr; current != NULL; current = *current == ')' ? &*(current+1) : current) {
if (is_number(*current)) {
tokens.push(read_token(expr, ¤t));
} else if (*current == '(') {
tokens.push({0, true});
} else if (*current == ')') {
while (!tokens.top().is_open) {
int op = tokens.top().value;
tokens.pop();
Token right = tokens.top();
tokens.pop();
Token left = tokens.top();
tokens.pop();
switch (op) {
case PLUS:
tokens.push({left.value + right.value, false});
break;
case MINUS:
tokens.push({left.value - right.value, false});
break;
case MUL:
tokens.push({left.value * right.value, false});
break;
case DIV:
if (right.value != 0)
tokens.push({left.value / right.value, false});
else
printf("Division by zero error\n");
break;
}
}
tokens.pop(); // Pop the opening parenthesis
}
}
while (!tokens.empty()) {
int op = tokens.top().value;
tokens.pop();
Token right = tokens.top();
tokens.pop();
Token left = tokens.top();
tokens.pop();
switch (op) {
case PLUS:
printf("%d ", left.value + right.value);
break;
case MINUS:
printf("%d ", left.value - right.value);
break;
case MUL:
printf("%d ", left.value * right.value);
break;
case DIV:
if (right.value != 0)
printf("%d ", left.value / right.value);
else
printf("Division by zero error\n");
break;
}
}
}
int main() {
char expr[] = "((3+5)*2)/4";
simplify_expression(expr);
return 0;
}
```
这个程序首先读取输入的表达式,然后使用一个栈来存储操作数和括号。遇到数字就创建一个Token;遇到左括号就入栈;遇到右括号时,会一直出栈直到找到匹配的左括号,将其中的操作合并。最后剩下的就是简化后的有效表达式。
请注意,这个代码仅用于演示目的,并未处理所有边界情况和错误处理,实际应用中可能需要更完善的解析器。
阅读全文