Different Ways to Add Parentheses 为运算表达式设计优先级

给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +- 以及 * 。

示例 1:

输入: "2-1-1"
输出: [0, 2]
解释: 
((2-1)-1) = 0 
(2-(1-1)) = 2

示例 2:

输入: "2*3-4*5"
输出: [-34, -14, -10, -10, 10]
解释: 
(2*(3-(4*5))) = -34 
((2*3)-(4*5)) = -14 
((2*(3-4))*5) = -10 
(2*((3-4)*5)) = -10 
(((2*3)-4)*5) = 10

思路:采用分治的思想,对于string的每一个operator,都看作:左集合operator右集合的结果,所以递归调用计算出左部分的集合left(vector<int> left),递归调用计算右部分的集合right(vector<int> right),对于操作的每一个operator都看成左集合left和右集合right的遍历操作,对每个元素都进行operator操作。最后放到res中,如果res为空,表示这次input只有数字,则把字符串转为数字压进res中。

参考代码:

    vector<int> diffWaysToCompute(string input) {
	vector<int> res;
	int length = input.size();
	for (int i = 0; i < length; i++) {
		if (input[i] == '+' || input[i] == '-' || input[i] == '*') {
			vector<int> left = diffWaysToCompute(input.substr(0, i));
			vector<int> right = diffWaysToCompute(input.substr(i + 1));
			for (int j = 0; j < left.size(); j++) {
				for (int k = 0; k < right.size(); k++) {
					if (input[i] == '+') {
						res.push_back(left[j] + right[k]);
					}
					else if (input[i] == '-') {
						res.push_back(left[j] - right[k]);
					}
					else {
						res.push_back(left[j] * right[k]);
					}
				}
			}
		}
	}
	if (res.empty()) {
		res.push_back(atoi(input.c_str()));
	}
	return res;        
    }






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的实现: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_EXPR_LEN 100 // 表达式最大长度 // 定义栈结构体 typedef struct { double *items; int top; int size; } Stack; // 初始化栈 void initStack(Stack *s, int size) { s->items = (double *) malloc(sizeof(double) * size); s->top = -1; s->size = size; } // 判断栈是否为空 int isEmpty(Stack *s) { return s->top == -1; } // 判断栈是否已满 int isFull(Stack *s) { return s->top == s->size - 1; } // 入栈操作 void push(Stack *s, double item) { if (isFull(s)) { printf("Stack Overflow\n"); exit(1); } s->top++; s->items[s->top] = item; } // 出栈操作 double pop(Stack *s) { if (isEmpty(s)) { printf("Stack Underflow\n"); exit(1); } return s->items[s->top--]; } // 获取栈顶元素 double peek(Stack *s) { if (isEmpty(s)) { printf("Stack Underflow\n"); exit(1); } return s->items[s->top]; } // 判断运算优先级大小 int precedence(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return -1; } } // 计算表达式的值 double evaluate(char *expr) { Stack numStack, opStack; initStack(&numStack, MAX_EXPR_LEN); initStack(&opStack, MAX_EXPR_LEN); int i = 0; while (expr[i] != '\0') { if (isdigit(expr[i])) { // 如果是数字,将其转换为 double 类型并入数字栈 char *endPtr; double num = strtod(&expr[i], &endPtr); push(&numStack, num); i = endPtr - expr; } else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') { // 如果是运算符,将其与运算符栈栈顶元素比较优先级 while (!isEmpty(&opStack) && precedence(peek(&opStack)) >= precedence(expr[i])) { double num2 = pop(&numStack); double num1 = pop(&numStack); char op = pop(&opStack); switch (op) { case '+': push(&numStack, num1 + num2); break; case '-': push(&numStack, num1 - num2); break; case '*': push(&numStack, num1 * num2); break; case '/': push(&numStack, num1 / num2); break; } } push(&opStack, expr[i]); i++; } else if (expr[i] == '(') { // 如果是左括号,入运算符栈 push(&opStack, expr[i]); i++; } else if (expr[i] == ')') { // 如果是右括号,弹出运算符栈中的运算符进行计算,直到遇到左括号 while (!isEmpty(&opStack) && peek(&opStack) != '(') { double num2 = pop(&numStack); double num1 = pop(&numStack); char op = pop(&opStack); switch (op) { case '+': push(&numStack, num1 + num2); break; case '-': push(&numStack, num1 - num2); break; case '*': push(&numStack, num1 * num2); break; case '/': push(&numStack, num1 / num2); break; } } if (!isEmpty(&opStack) && peek(&opStack) == '(') { pop(&opStack); } else { printf("Mismatched Parentheses\n"); exit(1); } i++; } else { // 如果是非法字符,报错退出 printf("Invalid Character\n"); exit(1); } } // 将剩余的运算符依次弹出进行计算 while (!isEmpty(&opStack)) { double num2 = pop(&numStack); double num1 = pop(&numStack); char op = pop(&opStack); switch (op) { case '+': push(&numStack, num1 + num2); break; case '-': push(&numStack, num1 - num2); break; case '*': push(&numStack, num1 * num2); break; case '/': push(&numStack, num1 / num2); break; } } // 返回最终结果 return pop(&numStack); } int main() { char expr[MAX_EXPR_LEN]; printf("Enter an expression: "); scanf("%s", expr); double result = evaluate(expr); printf("Result: %f\n", result); return 0; } ``` 这个计算器可以处理小数的四则运算,同时支持带括号的表达式。你可以输入类似 `1.23 + 4.56 * (7.89 - 0.12)` 这样的表达式进行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值