1、 用程序实现波兰符号法。 实现功能:输入波兰符号法公式,求出公式类型 输入:波兰符号法的数学计算公式或命题公式 输出:输出公式类型。
时间: 2024-03-25 09:40:12 浏览: 46
java实现逆波兰计算器,输入中缀表达式可以得到后缀表达式,并且计算这个后缀表达式的值, 且输入的表达式只要正确即可运行
以下是一个简单的C语言程序,用于实现波兰符号法的数学计算和命题公式的求值,并输出公式类型。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100
// 定义栈结构
typedef struct {
int top;
int data[MAX_STACK_SIZE];
} stack;
// 初始化栈
void init_stack(stack *s) {
s->top = -1;
}
// 判断栈是否为空
int is_empty_stack(stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int is_full_stack(stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
// 入栈
void push(stack *s, int x) {
if (is_full_stack(s)) {
printf("Stack Overflow\n");
exit(1);
}
s->data[++s->top] = x;
}
// 出栈
int pop(stack *s) {
if (is_empty_stack(s)) {
printf("Stack Underflow\n");
exit(1);
}
return s->data[s->top--];
}
// 计算数学公式的值
int evaluate_math_expression(char *expression) {
stack s;
int i, len, op1, op2, result;
char *token;
init_stack(&s); // 初始化栈
len = strlen(expression); // 计算表达式长度
// 从右至左扫描表达式
for (i = len - 1; i >= 0; i--) {
// 如果是空格,则跳过
if (expression[i] == ' ') {
continue;
}
// 如果是操作数,则入栈
if (expression[i] >= '0' && expression[i] <= '9') {
token = &expression[i];
push(&s, atoi(token));
// 将指针移动至下一个操作数
while (i > 0 && expression[i - 1] >= '0' && expression[i - 1] <= '9') {
i--;
}
}
// 如果是运算符,则从栈中取出相应数量的操作数进行计算
else {
op1 = pop(&s);
op2 = pop(&s);
switch (expression[i]) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
default:
printf("Invalid Operator\n");
exit(1);
}
// 将计算结果入栈
push(&s, result);
}
}
// 返回计算结果
return pop(&s);
}
// 判断命题公式的真假值
int evaluate_proposition(char *expression) {
stack s;
int i, len, op1, op2, result;
char *token;
init_stack(&s); // 初始化栈
len = strlen(expression); // 计算表达式长度
// 从右至左扫描表达式
for (i = len - 1; i >= 0; i--) {
// 如果是空格,则跳过
if (expression[i] == ' ') {
continue;
}
// 如果是操作数,则入栈
if (expression[i] == '0' || expression[i] == '1') {
push(&s, expression[i] - '0');
}
// 如果是运算符,则从栈中取出相应数量的操作数进行计算
else {
op1 = pop(&s);
op2 = pop(&s);
switch (expression[i]) {
case '&':
result = op1 && op2;
break;
case '|':
result = op1 || op2;
break;
case '!':
result = !op1;
break;
default:
printf("Invalid Operator\n");
exit(1);
}
// 将计算结果入栈
push(&s, result);
}
}
// 返回计算结果
return pop(&s);
}
// 判断公式类型
void determine_expression_type(char *expression) {
int i, len, math_flag = 0, prop_flag = 0;
len = strlen(expression); // 计算表达式长度
// 判断数学公式类型
for (i = 0; i < len; i++) {
if (expression[i] >= '0' && expression[i] <= '9') {
math_flag = 1;
break;
}
}
if (math_flag) {
printf("Math Expression\n");
printf("Result: %d\n", evaluate_math_expression(expression));
return;
}
// 判断命题公式类型
for (i = 0; i < len; i++) {
if (expression[i] == '0' || expression[i] == '1') {
prop_flag = 1;
break;
}
}
if (prop_flag) {
printf("Proposition\n");
printf("Value: %d\n", evaluate_proposition(expression));
return;
}
printf("Invalid Expression\n");
}
int main() {
char expression[100];
printf("Enter Polish Notation Expression: ");
gets(expression); // 输入波兰符号法公式
determine_expression_type(expression); // 判断公式类型并输出结果
return 0;
}
```
注意:该代码仅作为示例参考,实际应用中需要根据具体情况进行修改和优化。
阅读全文