算术表达式的求解 问题描述:给定一个算术表达式,通过c语言程序求出最后的结果。 基本要求: 1. 从键盘输入要求解的算术表达式: 2.采用栈结构进行算术表达式的求解过程;.能够判断算术表达式正确与否: 4.对于错误表达式给出提示; 5.对于正确的表达式给出最后的结果;
时间: 2024-03-19 22:45:34 浏览: 132
好的,这是一个计算器程序的基本框架,需要用到栈结构和中缀表达式转后缀表达式的算法。
首先,我们需要定义一个栈结构,可以使用数组或链表实现。栈的基本操作包括入栈、出栈、判断栈空和栈满等。
其次,需要实现中缀表达式转后缀表达式的算法。该算法的基本思路是从左到右遍历中缀表达式,遇到数字直接输出,遇到运算符则将其压入栈中,遇到括号则将其压入栈中,如果是右括号则将栈中的运算符依次输出直到遇到左括号为止。最后,将栈中的剩余运算符依次输出即可得到后缀表达式。
最后,根据后缀表达式进行计算。遍历后缀表达式,遇到数字则入栈,遇到运算符则从栈中取出相应的操作数进行运算,并将结果入栈。最后,栈中剩余的数字即为结果。
以下是一个简单的实现,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct Stack {
int data[MAX_SIZE];
int top;
} Stack;
void init_stack(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)) {
printf("Stack is full.\n");
exit(EXIT_FAILURE);
}
s->data[++s->top] = x;
}
int pop(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty.\n");
exit(EXIT_FAILURE);
}
return s->data[s->top--];
}
int get_top(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty.\n");
exit(EXIT_FAILURE);
}
return s->data[s->top];
}
int is_operator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int priority(char c) {
if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
} else {
return 0;
}
}
void infix_to_postfix(char *infix, char *postfix) {
Stack s;
init_stack(&s);
int i = 0, j = 0;
while (infix[i] != '\0') {
if (isdigit(infix[i])) {
postfix[j++] = infix[i];
} else if (is_operator(infix[i])) {
while (!is_empty(&s) && priority(get_top(&s)) >= priority(infix[i])) {
postfix[j++] = pop(&s);
}
push(&s, infix[i]);
} else if (infix[i] == '(') {
push(&s, infix[i]);
} else if (infix[i] == ')') {
while (get_top(&s) != '(') {
postfix[j++] = pop(&s);
}
pop(&s);
} else {
printf("Invalid expression.\n");
exit(EXIT_FAILURE);
}
i++;
}
while (!is_empty(&s)) {
postfix[j++] = pop(&s);
}
postfix[j] = '\0';
}
int postfix_eval(char *postfix) {
Stack s;
init_stack(&s);
int i = 0;
while (postfix[i] != '\0') {
if (isdigit(postfix[i])) {
push(&s, postfix[i] - '0');
} else if (is_operator(postfix[i])) {
int op2 = pop(&s);
int op1 = pop(&s);
int result;
switch (postfix[i]) {
case '+':
result = op1 + op2;
break;
case '-':
result = op1 - op2;
break;
case '*':
result = op1 * op2;
break;
case '/':
result = op1 / op2;
break;
}
push(&s, result);
} else {
printf("Invalid expression.\n");
exit(EXIT_FAILURE);
}
i++;
}
if (is_empty(&s)) {
printf("Invalid expression.\n");
exit(EXIT_FAILURE);
}
int result = pop(&s);
if (!is_empty(&s)) {
printf("Invalid expression.\n");
exit(EXIT_FAILURE);
}
return result;
}
int main() {
char infix[MAX_SIZE], postfix[MAX_SIZE];
printf("Enter an infix expression: ");
fgets(infix, MAX_SIZE, stdin);
infix[strlen(infix) - 1] = '\0'; // remove trailing '\n'
infix_to_postfix(infix, postfix);
printf("Postfix expression: %s\n", postfix);
int result = postfix_eval(postfix);
printf("Result: %d\n", result);
return 0;
}
```
阅读全文