项目三:算术表达式求解

【题目要求】

【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
 实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+2*70)/3-12*3
 5+(9*(62-37)+15)*6
 要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar);  //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar);   // 将字符’0’.’9’ 转换为整数 9

【需求分析】

1)实现标准整数类型的四则运算表达式(加减乘除)的求值。

2)包括括号,可多层嵌入。

3)要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。

【难点分析】

1)小数点,空置格,括号匹配

2)中缀表达式的求值是我们人最熟悉的,但是对计算机来说却不好操作。因此,在计算结果时,往往会将中缀表达式转成其它表达式来操作(一般转成后缀表达式。)

3)后缀表达式求解

4)从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果

【设计思路

 要实现完整计算式的输入并运算,就得用到计算后缀表达式的算法,和将中缀表达式转换为后缀表达式的算法(这里不再赘述中缀表达式和后缀表达式,以及之后有关栈的知识也不再多说,有兴趣可以阅读数据结构中关于栈的相关章节),这里重点讲解以上两个算法。

     算法1(中缀表达式转后缀表达式):

 因为计算式要在计算器的文本编辑框中显示,所以计算式用字符串记录(定义为字符串)

 规则:从左向右遍历中缀表达式

 ①:遇到数字字符,直接加入后缀表达式

 ②:遇到高优先级运算符,若栈为空直接入栈,若栈不为空,则将当前运算符与栈顶元素比较

比较1(栈顶元素也为高优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈。这样的操作使得栈中不会出现连续的高优先级运算符

比较2(栈顶元素为'('左括号):将当前元素入栈

比较3(栈顶元素为低优先级运算符):将当前元素入栈

 ③:遇到'('左括号,将左括号入栈

 ④:遇到')'右括号,将栈顶元素顺序出栈,直到栈顶元素为左括号,此时删去栈顶的左括号

 ⑤:遇到低优先级运算符,若栈为空直接入栈,若栈不为空,则将当前运算符与栈顶元素比较

 比较1(栈顶元素也为低优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈。这样的操作使得栈中不会出现连续的低优先级运算符

 比较2(栈顶元素为'('左括号):将当前运算符入栈

 比较3(栈顶元素为高优先级运算符):栈顶元素出栈加入后缀表达式,当前运算符入栈

算法2:计算后缀表达式

                 计算后缀表达式依然借助栈来实现

                 运算规则:遍历后缀表达式

                 ①:遇到数字字符,直接入栈

                 ②:遇到运算符,顺序出栈两个元素(数字),进行运算,将运算结果入栈

                 循环以上步骤最终栈中剩下的那个数字就是最终答案

算法3:开方运算(调用Math.sqrt()函数)

算法4:平方运算(调用Math.pow()函数)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个计算器程序的基本框架,需要用到栈结构和中缀表达式转后缀表达式的算法。 首先,我们需要定义一个栈结构,可以使用数组或链表实现。栈的基本操作包括入栈、出栈、判断栈空和栈满等。 其次,需要实现中缀表达式转后缀表达式的算法。该算法的基本思路是从左到右遍历中缀表达式,遇到数字直接输出,遇到运算符则将其压入栈中,遇到括号则将其压入栈中,如果是右括号则将栈中的运算符依次输出直到遇到左括号为止。最后,将栈中的剩余运算符依次输出即可得到后缀表达式。 最后,根据后缀表达式进行计算。遍历后缀表达式,遇到数字则入栈,遇到运算符则从栈中取出相应的操作数进行运算,并将结果入栈。最后,栈中剩余的数字即为结果。 以下是一个简单的实现,仅供参考: ```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; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值