c语言实现计算器能计算负数和括号
时间: 2024-01-15 12:03:04 浏览: 88
好的,针对您的要求,我可以给您提供一些思路和代码示例。
首先,计算器需要支持负数,我们可以在输入表达式时,判断符号位是否为负号,如果是,则将后面的数字取反。具体的实现可以参考下面的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100 //栈的最大容量
struct stack {
int top;
double data[MAX_STACK_SIZE];
};
//初始化栈
void init_stack(struct stack *s)
{
s->top = -1;
}
//判断栈是否为空
int is_empty(struct stack *s)
{
return s->top == -1;
}
//入栈
void push(struct stack *s, double val)
{
if (s->top == MAX_STACK_SIZE - 1) {
printf("Stack overflow!\n");
exit(1);
}
s->top++;
s->data[s->top] = val;
}
//出栈
double pop(struct stack *s)
{
if (is_empty(s)) {
printf("Stack underflow!\n");
exit(1);
}
double val = s->data[s->top];
s->top--;
return val;
}
//获取栈顶元素
double peek(struct stack *s)
{
if (is_empty(s)) {
printf("Stack underflow!\n");
exit(1);
}
return s->data[s->top];
}
//判断字符是否为数字
int is_digit(char c)
{
return c >= '0' && c <= '9';
}
//计算表达式
double evaluate(char *expr)
{
struct stack nums, ops;
init_stack(&nums);
init_stack(&ops);
int len = strlen(expr);
int i = 0;
while (i < len) {
if (expr[i] == ' ') {
i++;
continue;
}
else if (is_digit(expr[i])) {
double num = 0;
while (i < len && is_digit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
if (i < len && expr[i] == '.') {
i++;
double frac = 0.1;
while (i < len && is_digit(expr[i])) {
num += (expr[i] - '0') * frac;
frac *= 0.1;
i++;
}
}
if (!is_empty(&ops) && peek(&ops) == '-') {
num = -num;
pop(&ops);
push(&ops, '+');
}
push(&nums, num);
}
else if (expr[i] == '(') {
push(&ops, expr[i]);
i++;
}
else if (expr[i] == ')') {
while (peek(&ops) != '(') {
char op = pop(&ops);
double b = pop(&nums);
double a = pop(&nums);
switch (op) {
case '+':
push(&nums, a + b);
break;
case '-':
push(&nums, a - b);
break;
case '*':
push(&nums, a * b);
break;
case '/':
push(&nums, a / b);
break;
}
}
pop(&ops);
i++;
}
else {
while (!is_empty(&ops) && peek(&ops) != '(' && peek(&ops) != ')') {
char op = pop(&ops);
double b = pop(&nums);
double a = pop(&nums);
switch (op) {
case '+':
push(&nums, a + b);
break;
case '-':
push(&nums, a - b);
break;
case '*':
push(&nums, a * b);
break;
case '/':
push(&nums, a / b);
break;
}
}
push(&ops, expr[i]);
i++;
}
}
while (!is_empty(&ops)) {
char op = pop(&ops);
double b = pop(&nums);
double a = pop(&nums);
switch (op) {
case '+':
push(&nums, a + b);
break;
case '-':
push(&nums, a - b);
break;
case '*':
push(&nums, a * b);
break;
case '/':
push(&nums, a / b);
break;
}
}
return pop(&nums);
}
int main()
{
char expr[100];
printf("请输入表达式:");
fgets(expr, sizeof(expr), stdin);
double result = evaluate(expr);
printf("计算结果为:%g\n", result);
return 0;
}
```
接下来,计算器需要支持括号,我们可以在计算表达式时,遇到左括号就将其压入操作符栈中,遇到右括号就将操作符栈中的操作符依次弹出,并对数字栈中的数字进行相应的计算,直到遇到左括号为止。具体的实现可以参考上面的代码。
至此,我们就实现了一个支持负数和括号的计算器。
阅读全文