用C语言设计计算器程序,要求能计算带括号的加减乘除,连续乘除,输入样例:(2+32)/2-6 ;输出样例:11 。
时间: 2024-02-11 21:07:35 浏览: 95
好的,这是一个很好的编程问题。我可以给你一个大概的思路来解决这个问题。
首先,我们需要将输入的表达式转化为一个可以计算的形式。我们可以使用中缀表达式转后缀表达式的方法来实现这一点。具体来说,我们可以使用一个栈来存储运算符,然后扫描表达式中的每个元素,如果是数字,直接输出;如果是运算符,将其与栈顶元素进行比较,如果栈顶元素优先级高于当前运算符,则将栈顶元素弹出输出,直到栈顶元素优先级低于当前运算符或者栈为空,然后将当前运算符入栈;如果是左括号,直接入栈;如果是右括号,将栈顶元素弹出输出,直到遇到左括号。最终栈中剩余的运算符依次弹出输出。
然后,我们可以使用另一个栈来计算后缀表达式的值。具体来说,我们依次扫描后缀表达式中的每个元素,如果是数字,入栈;如果是运算符,将栈顶的两个元素弹出,进行相应的运算,将结果入栈。最终栈中剩余的元素就是表达式的值。
下面是一个简单的示例代码,可以供你参考:
```c
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 100
typedef struct {
int top;
char data[STACK_SIZE];
} Stack;
void init_stack(Stack *stack) {
stack->top = -1;
}
void push(Stack *stack, char c) {
if (stack->top == STACK_SIZE - 1) {
printf("Stack overflow\n");
exit(1);
}
stack->data[++stack->top] = c;
}
char pop(Stack *stack) {
if (stack->top == -1) {
printf("Stack underflow\n");
exit(1);
}
return stack->data[stack->top--];
}
char top(Stack *stack) {
if (stack->top == -1) {
printf("Stack underflow\n");
exit(1);
}
return stack->data[stack->top];
}
int is_digit(char c) {
return c >= '0' && c <= '9';
}
int is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int get_priority(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
int calculate(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
if (b == 0) {
printf("Divide by zero\n");
exit(1);
}
return a / b;
default:
printf("Invalid operator\n");
exit(1);
}
}
int evaluate(const char *expr) {
Stack op_stack;
init_stack(&op_stack);
Stack num_stack;
init_stack(&num_stack);
int i = 0;
while (expr[i] != '\0') {
if (is_digit(expr[i])) {
int num = 0;
while (is_digit(expr[i])) {
num = num * 10 + expr[i] - '0';
i++;
}
push(&num_stack, num);
} else if (is_operator(expr[i])) {
while (get_priority(expr[i]) <= get_priority(top(&op_stack)) && top(&op_stack) != '(') {
char op = pop(&op_stack);
int b = pop(&num_stack);
int a = pop(&num_stack);
int c = calculate(a, b, op);
push(&num_stack, c);
}
push(&op_stack, expr[i]);
i++;
} else if (expr[i] == '(') {
push(&op_stack, expr[i]);
i++;
} else if (expr[i] == ')') {
while (top(&op_stack) != '(') {
char op = pop(&op_stack);
int b = pop(&num_stack);
int a = pop(&num_stack);
int c = calculate(a, b, op);
push(&num_stack, c);
}
pop(&op_stack);
i++;
} else {
printf("Invalid character\n");
exit(1);
}
}
while (op_stack.top != -1) {
char op = pop(&op_stack);
int b = pop(&num_stack);
int a = pop(&num_stack);
int c = calculate(a, b, op);
push(&num_stack, c);
}
return pop(&num_stack);
}
int main() {
char expr[100];
printf("Enter an expression: ");
scanf("%s", expr);
int result = evaluate(expr);
printf("Result: %d\n", result);
return 0;
}
```
注意,上面的代码只是一个简单的示例,可能存在一些漏洞和不足之处,需要根据具体情况进行修改和完善。
阅读全文