输入波兰符号法算是 求出公式类型和值 c语言
时间: 2024-02-23 09:00:43 浏览: 79
C++逆波兰表达式求值.zip
好的,以下是一个 C 代码实现,可以根据输入的波兰符号法算式判断出公式类型并计算其值:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
typedef struct {
double data[MAX_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 == MAX_STACK_SIZE - 1;
}
void push(Stack *s, double x) {
if (isFull(s)) {
printf("Error: Stack overflow.\n");
exit(EXIT_FAILURE);
}
s->data[++s->top] = x;
}
double pop(Stack *s) {
if (isEmpty(s)) {
printf("Error: Stack underflow.\n");
exit(EXIT_FAILURE);
}
return s->data[s->top--];
}
double eval(char **tokens, int n) {
Stack s;
initStack(&s);
for (int i = 0; i < n; i++) {
if (isdigit(tokens[i][0])) { // 如果是数字,将其转换为 double 类型并压入栈中
push(&s, atof(tokens[i]));
} else { // 如果是运算符,从栈中弹出两个操作数并执行相应的运算
double op2 = pop(&s);
double op1 = pop(&s);
if (tokens[i][0] == '+') {
push(&s, op1 + op2);
} else if (tokens[i][0] == '-') {
push(&s, op1 - op2);
} else if (tokens[i][0] == '*') {
push(&s, op1 * op2);
} else if (tokens[i][0] == '/') {
push(&s, op1 / op2);
} else {
printf("Error: Invalid operator '%s'.\n", tokens[i]);
exit(EXIT_FAILURE);
}
}
}
return pop(&s);
}
int main() {
char expr[100];
printf("请输入波兰符号法算式:");
fgets(expr, 100, stdin); // 从标准输入读取输入的算式
char *tokens[100];
int n = 0;
char *token = strtok(expr, " "); // 使用空格作为分隔符,将输入的算式分割成一个个字符串
while (token != NULL) {
tokens[n++] = token;
token = strtok(NULL, " ");
}
int numCount = 0, opCount = 0; // 统计操作数和运算符的个数
for (int i = 0; i < n; i++) {
if (isdigit(tokens[i][0])) {
numCount++;
} else {
opCount++;
}
}
double result = 0;
if (numCount == opCount + 1) {
printf("公式类型为基本四则运算。\n");
result = eval(tokens, n);
} else if (numCount == opCount) {
printf("公式类型为逆波兰表达式。\n");
result = eval(tokens, n);
} else {
printf("输入的算式不合法。\n");
exit(EXIT_FAILURE);
}
printf("计算结果为:%f\n", result);
return 0;
}
```
这个代码使用了栈来计算输入的逆波兰表达式或基本四则运算的值,并根据数字和运算符的数量来判断公式类型。如果输入的算式不合法,程序将会输出错误信息并退出。
阅读全文