算术表达式计算 【基本功能与要求】 (1) 输入中缀表达式转换为后缀表达式,输入后缀表达式转换为中缀表达式。 (2) 对表达式求值。 (3)编写一个主函数,测试所设计的算法。按以上要求,用c语言编写一个程序出来
时间: 2025-02-03 22:15:23 浏览: 43
以下是一个用C语言编写的程序,能够实现中缀表达式与后缀表达式的转换,并对表达式进行求值:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX 100
// 栈结构定义
typedef struct {
char items[MAX];
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 - 1;
}
// 入栈
void push(Stack *s, char c) {
if (!isFull(s)) {
s->items[++(s->top)] = c;
}
}
// 出栈
char pop(Stack *s) {
if (!isEmpty(s)) {
return s->items[(s->top)--];
}
return '\0';
}
// 获取栈顶元素
char peek(Stack *s) {
if (!isEmpty(s)) {
return s->items[s->top];
}
return '\0';
}
// 判断字符是否为操作符
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 获取操作符优先级
int precedence(char c) {
if (c == '*' || c == '/') {
return 2;
} else if (c == '+' || c == '-') {
return 1;
}
return 0;
}
// 中缀表达式转换为后缀表达式
void infixToPostfix(char *infix, char *postfix) {
Stack s;
initStack(&s);
int i = 0, j = 0;
while (infix[i] != '\0') {
char c = infix[i];
if (isspace(c)) {
i++;
continue;
}
if (isdigit(c) || isalpha(c)) {
postfix[j++] = c;
} else if (c == '(') {
push(&s, c);
} else if (c == ')') {
while (!isEmpty(&s) && peek(&s) != '(') {
postfix[j++] = pop(&s);
}
pop(&s); // 弹出 '('
} else if (isOperator(c)) {
while (!isEmpty(&s) && precedence(peek(&s)) >= precedence(c)) {
postfix[j++] = pop(&s);
}
push(&s, c);
}
i++;
}
while (!isEmpty(&s)) {
postfix[j++] = pop(&s);
}
postfix[j] = '\0';
}
// 后缀表达式求值
int evaluatePostfix(char *postfix) {
Stack s;
initStack(&s);
int i = 0;
while (postfix[i] != '\0') {
char c = postfix[i];
if (isspace(c)) {
i++;
continue;
}
if (isdigit(c)) {
push(&s, c - '0');
} else if (isOperator(c)) {
int right = pop(&s) - '0';
int left = pop(&s) - '0';
int result;
switch (c) {
case '+':
result = left + right;
break;
case '-':
result = left - right;
break;
case '*':
result = left * right;
break;
case '/':
result = left / right;
break;
}
push(&s, result + '0');
}
i++;
}
return pop(&s) - '0';
}
// 中缀表达式求值
int evaluateInfix(char *infix) {
char postfix[MAX];
infixToPostfix(infix, postfix);
return evaluatePostfix(postfix);
}
int main() {
char infix[MAX], postfix[MAX];
printf("请输入中缀表达式: ");
fgets(infix, MAX, stdin);
infix[strcspn(infix, "\n")] = '\0'; // 去掉换行符
infixToPostfix(infix, postfix);
printf("后缀表达式: %s\n", postfix);
int result = evaluateInfix(infix);
printf("表达式的值: %d\n", result);
return 0;
}
```
这个程序实现了以下功能:
1. 将中缀表达式转换为后缀表达式。
2. 对后缀表达式进行求值。
3. 提供了直接对中缀表达式求值的功能。
4. 在主函数中测试了上述功能。
使用说明:
1. 输入中缀表达式时,可以用空格分隔各个元素,也可以不用。
2. 支持的运算符包括 +, -, *, /。
3. 支持使用括号 () 来改变运算顺序。
4. 支持整数运算。
这个程序可以作为算术表达式计算的基本框架。根据需要,你可以在此基础上进行扩展,比如增加更多的运算符、支持浮点数运算等。
阅读全文
相关推荐















