用C语言写代码1、[问题描述]输入一个中缀表达式,将其转换为后缀表达式,然后对后缀表达式进行求值。运算符包括“+”、“-”、“*”“/”、“(”“) ”、“#”,参加运算的数为小于 10 的自然数。 2、[输入要求]多组数据,每组数据一行,对应一个算术表达式,每个表达式均 以“#”结尾。当表达式只有一个“#”时,输入结束。 3、[输出要求]对于每组数据输出 2 行,第一行为中缀表达式对应的后缀式,第2行为后缀求值的运算结果。
时间: 2023-06-15 15:06:04 浏览: 96
c代码-3. 功能:编写一个简单计算器程序,输入格式为:a opb。其中a和b是参加运算的p数,op为运算符,它的取值只能是+、-、*、/。
以下是用C语言实现的代码,其中使用了栈来实现中缀表达式转后缀表达式和后缀表达式求值的过程:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
void init(Stack *s) {
s->top = -1;
}
int is_empty(Stack *s) {
return s->top == -1;
}
int is_full(Stack *s) {
return s->top == MAX_SIZE - 1;
}
void push(Stack *s, int x) {
if (!is_full(s)) {
s->top++;
s->data[s->top] = x;
}
}
int pop(Stack *s) {
int x = -1;
if (!is_empty(s)) {
x = s->data[s->top];
s->top--;
}
return x;
}
int peek(Stack *s) {
int x = -1;
if (!is_empty(s)) {
x = s->data[s->top];
}
return x;
}
int is_digit(char c) {
return c >= '0' && c <= '9';
}
int is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int priority(char c) {
if (c == '*' || c == '/') {
return 2;
} else if (c == '+' || c == '-') {
return 1;
} else {
return 0;
}
}
void infix_to_postfix(char *infix, char *postfix) {
Stack s;
init(&s);
int i = 0, j = 0;
while (infix[i] != '#') {
char c = infix[i];
if (is_digit(c)) {
postfix[j++] = c;
} else if (c == '(') {
push(&s, c);
} else if (is_operator(c)) {
while (!is_empty(&s) && peek(&s) != '(' && priority(peek(&s)) >= priority(c)) {
postfix[j++] = pop(&s);
}
push(&s, c);
} else if (c == ')') {
while (!is_empty(&s) && peek(&s) != '(') {
postfix[j++] = pop(&s);
}
pop(&s);
}
i++;
}
while (!is_empty(&s)) {
postfix[j++] = pop(&s);
}
postfix[j] = '\0';
}
int evaluate_postfix(char *postfix) {
Stack s;
init(&s);
int i = 0, result = 0;
while (postfix[i] != '\0') {
char c = postfix[i];
if (is_digit(c)) {
push(&s, c - '0');
} else if (is_operator(c)) {
int b = pop(&s);
int a = pop(&s);
switch (c) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/': result = a / b; break;
}
push(&s, result);
}
i++;
}
return pop(&s);
}
int main() {
char infix[MAX_SIZE], postfix[MAX_SIZE];
while (1) {
printf("请输入中缀表达式(以#结尾):");
scanf("%s", infix);
if (infix[0] == '#' && infix[1] == '\0') {
break;
}
infix_to_postfix(infix, postfix);
printf("后缀表达式为:%s\n", postfix);
printf("计算结果为:%d\n", evaluate_postfix(postfix));
}
return 0;
}
```
这里我们定义了一个栈结构体,其中包含了栈的数据和栈顶指针。栈的初始化、判断是否为空、判断是否为满、入栈、出栈和查看栈顶元素的操作都被封装在了函数中,可以方便地调用。
在中缀表达式转后缀表达式的过程中,我们使用了一个栈来保存运算符,遇到数字直接输出到后缀表达式中,遇到左括号直接入栈,遇到右括号则弹出栈中所有运算符直到遇到左括号,遇到运算符则与栈顶元素比较优先级,如果栈顶元素优先级大于等于当前运算符,则弹出栈顶元素并输出到后缀表达式中,然后再将当前运算符入栈。最后将栈中剩余的运算符全部输出到后缀表达式中即可。
在后缀表达式求值的过程中,我们同样使用了一个栈来保存操作数,遇到数字直接入栈,遇到运算符则弹出栈顶的两个操作数进行计算,然后将计算结果入栈。最后栈中剩余的元素就是最终的结果。
注意在本题中,输入的表达式中只包含小于 10 的自然数,因此我们可以直接将字符转换为数字进行计算。如果表达式中可能包含多位数字,我们需要使用字符串转换为数字的方法进行计算。
阅读全文