用栈写一个手机计算器用c语言
时间: 2024-12-02 10:17:41 浏览: 2
使用栈来编写一个简单的手机计算器功能,主要是利用栈来模拟操作数和运算符的输入顺序,实现前缀表达式(Prefix Notation)或者逆波兰表示法(Reverse Polish Notation,RPN)。下面是一个基础的C语言实现思路:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX stack_size
typedef struct {
char op[3];
int val;
} Node;
Node stack[MAX];
int top = -1; }
// 入栈
void push(char c) {
if (top < MAX - 1) {
stack[++top] = {' ', c, 0};
} else {
printf("Stack overflow.\n");
}
}
// 出栈并处理运算
double popAndEval() {
if (isEmpty()) return 0;
char op = stack[top].op[1]; // 第二个字符是运算符
double val2 = popAndEval(); // 计算第二个操作数
double val1 = popAndEval();
switch(op) {
case '+':
stack[top].val = val1 + val2;
break;
case '-':
stack[top].val = val1 - val2;
break;
case '*':
stack[top].val = val1 * val2;
break;
case '/':
stack[top].val = (double)val1 / val2;
break;
default:
printf("Invalid operator.\n");
return 0;
}
return stack[top].val;
}
// 输入一个字符,如果遇到数字就累加进栈
double calculate(char input[]) {
for (char *s = input; *s != '\0'; ++s) {
if (*s >= '0' && *s <= '9') {
push(*s - '0');
} else if (*s == '+' || *s == '-' || *s == '*' || *s == '/') {
double result = popAndEval();
push(result);
} else if (*s == '.') {
while (*++s >= '0' && *s <= '9') {
push(*s - '0');
}
} else {
printf("Invalid input.\n");
break;
}
}
return popAndEval();
}
int main() {
char input[50];
printf("Enter a mathematical expression using the stack method (e.g., 1+2*3): ");
fgets(input, sizeof(input), stdin);
// Remove newline character from input
input[strlen(input) - 1] = '\0';
double result = calculate(input);
printf("Result: %.2f\n", result);
return 0;
}
```
这个程序首先读取用户输入的数学表达式,然后逐个处理字符,将数字入栈,遇到运算符则取出栈顶的两个元素进行运算,并把结果放回栈。最后,计算完所有操作后,栈顶剩下的就是最终的结果。
阅读全文