用循环与递归的方法键盘输入一个含有括号的四则运算表达式,可能含有多余的括号,编写整理该表达 去掉所有多余的括号,元表达式中所有变量和元素安抚相对位置不变并且保持与原表达式等价的C语言代码
时间: 2024-10-20 19:04:53 浏览: 39
删除多余括号 1
在C语言中,我们可以使用栈数据结构来处理这个问题,因为栈可以帮助我们跟踪括号的配对过程。下面是一个简单的递归函数,用于移除多余括号并保持表达式的平衡:
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool is_valid(char ch) {
return ch == '(' || ch == ')' || ch >= '0' && ch <= '9';
}
void remove_extra_parens(char *expr) {
int len = strlen(expr);
if (len < 2 || !is_valid(expr[0]) || !is_valid(expr[len - 1])) {
// 如果表达式太短、开头不是操作数也不是左括号,或者结尾不符合条件,则不需要处理
printf("%s\n", expr);
return;
}
stack_t *stack = create_stack();
for (int i = 0; i < len; ++i) {
char ch = expr[i];
if (ch == '(') {
push(stack, ch);
} else if (ch == ')') {
if (!stack || peek(stack) != '(') {
// 如果遇到右括号但没有对应的左括号,直接删除它
expr[i] = '\0';
} else {
pop(stack);
}
} else if (is_valid(ch)) {
// 如果是操作数,插入到当前有效括号范围内
while (stack && peek(stack) == '(') {
printf("%c", pop(stack));
}
printf("%c", ch);
}
}
// 输出剩余部分,如果有任何剩余的左括号,则表示有未配对的括号,因此返回错误
while (!isEmpty(stack)) {
if (peek(stack) == '(') {
break;
}
printf("%c", pop(stack));
}
printf("\n");
destroy_stack(stack);
}
// 示例栈结构及相关的辅助函数
typedef struct {
char *data;
size_t top;
} stack_t;
stack_t *create_stack() {
return malloc(sizeof(stack_t) + 1);
}
void push(stack_t *stack, char c) {
stack->data[stack->top++] = c;
}
char pop(stack_t *stack) {
return stack->data[--stack->top];
}
bool isEmpty(stack_t *stack) {
return stack->top == 0;
}
void destroy_stack(stack_t *stack) {
free(stack->data);
free(stack);
}
int main() {
char input[100];
printf("请输入含有括号的四则运算表达式:");
fgets(input, sizeof(input), stdin);
remove_extra_parens(input);
return 0;
}
```
当你运行这个程序并输入一个带有多余括号的表达式时,它会打印出移除多余括号后的等效表达式。
阅读全文