用C语言设计一个简单的计算器,有一个简洁的菜单,可以带括号进行+,-,*,/,运算,且不限定运算式的输入长度.
时间: 2023-09-20 22:04:38 浏览: 154
好的,以下是一个简单的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_SIZE 100
typedef struct {
char data[STACK_SIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
int isFull(Stack *s) {
return s->top == STACK_SIZE - 1;
}
void push(Stack *s, char c) {
if (isFull(s)) {
printf("栈已满,无法入栈!\n");
exit(1);
}
s->data[++s->top] = c;
}
char pop(Stack *s) {
if (isEmpty(s)) {
printf("栈已空,无法出栈!\n");
exit(1);
}
return s->data[s->top--];
}
char peek(Stack *s) {
if (isEmpty(s)) {
printf("栈已空,无法取栈顶元素!\n");
exit(1);
}
return s->data[s->top];
}
int priority(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
case ')':
return 0;
default:
printf("不支持的运算符:%c\n", c);
exit(1);
}
}
void infixToPostfix(char *infix, char *postfix) {
Stack s;
initStack(&s);
char c;
int i, j = 0;
for (i = 0; infix[i] != '\0'; i++) {
if (isdigit(infix[i])) {
postfix[j++] = infix[i];
while (isdigit(infix[i + 1]))
postfix[j++] = infix[++i];
postfix[j++] = ' ';
} else if (infix[i] == '(') {
push(&s, infix[i]);
} else if (infix[i] == ')') {
while ((c = pop(&s)) != '(')
postfix[j++] = c;
postfix[j++] = ' ';
} else {
while (!isEmpty(&s) && priority(peek(&s)) >= priority(infix[i]))
postfix[j++] = pop(&s);
push(&s, infix[i]);
}
}
while (!isEmpty(&s))
postfix[j++] = pop(&s);
postfix[j] = '\0';
}
double evaluate(char *postfix) {
Stack s;
initStack(&s);
int i;
double num, op1, op2;
char c;
for (i = 0; postfix[i] != '\0'; i++) {
if (isdigit(postfix[i])) {
num = 0;
while (isdigit(postfix[i])) {
num = num * 10 + postfix[i] - '0';
i++;
}
push(&s, num);
} else if (postfix[i] != ' ') {
op2 = pop(&s);
op1 = pop(&s);
switch (postfix[i]) {
case '+':
push(&s, op1 + op2);
break;
case '-':
push(&s, op1 - op2);
break;
case '*':
push(&s, op1 * op2);
break;
case '/':
push(&s, op1 / op2);
break;
default:
printf("不支持的运算符:%c\n", postfix[i]);
exit(1);
}
}
}
return pop(&s);
}
int main() {
char infix[100];
char postfix[100];
printf("请输入一个算术表达式:");
scanf("%[^\n]", infix);
infixToPostfix(infix, postfix);
printf("后缀表达式:%s\n", postfix);
double result = evaluate(postfix);
printf("结果:%f\n", result);
return 0;
}
```
这个程序使用了两个函数,`infixToPostfix` 将中缀表达式转换为后缀表达式,`evaluate` 对后缀表达式进行求值。其中,`infixToPostfix` 函数使用了栈来处理运算符,并按照优先级和括号进行转换;`evaluate` 函数同样使用了栈来存储操作数,并按照后缀表达式的顺序进行求值。
程序先读入一个算术表达式,然后将其转换为后缀表达式,并输出后缀表达式。接着,程序对后缀表达式进行求值,并输出结果。需要注意的是,程序中使用了 `scanf("%[^\n]", infix)` 来读入一行算术表达式,这可以避免因为空格等问题无法正确读入。
阅读全文