C语言实现中缀表达式求值算法,算法3-4:表达式求值 (C++代码)

解题思路:

问题描述:

输入由整型分量和操作符组成的中缀表达式,输出其后缀表达式和运算的结果。整型分量:十进制数。操作符:( , ) , + , - , * , / 。

如输入3*(5-8/2)+7,输出 3 5 8 2 / - * 7 +,结果是10;

输入3-(1/4+7)*3 ,输出 3 1 4 / 7 + 3 * -,结果是 -18.75;

输入3*4/5*(5-7)+4,输出 3 4 * 5 / 5 7 - * 4 +,结果是-0.8。

注意:输入的运算分量为十进制数,输出可能是小数。

问题分析:

中缀表达式难以直接求值,要通过转化为其后缀表达式计算。转化和求值过程都需要借助STL的STACK来实现。

转化:

1)顺序扫描中缀表达式,

当遇到一个左括号时立即将其压栈;

当遇到对应的右括号时,将栈中的操作符弹出并输出,直到遇到左括号。最后再弹出左括号(但不输出);

当遇到一个分量时,立即输出;

当遇到一个操作符时,将它与栈顶操作符比较:

<1>如果它比栈顶的操作符优先级高,或者它是左括号后的第一个操作符,则将其压入栈;

<2>否则(低或相等),将栈顶操作符弹出并输出;

<3>继续比较,如果它比新的栈顶操作符的优先级高,跳到 2),否则,重复<

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于中缀表达式的计算涉及到运算符的优先级和括号的影响,因此需要使用栈来辅助计算。具体步骤如下: 1. 定义一个栈来存储运算符和操作数。 2. 从左到右扫描中缀表达式,如果当前字符为数字,则将其入栈。 3. 如果当前字符为运算符,则判断其与栈顶运算符的优先级,如果当前运算符优先级小于等于栈顶运算符优先级,则将栈顶运算符弹出并进行运算,将运算结果入栈,重新比较当前运算符与栈顶运算符的优先级。如果当前运算符优先级大于栈顶运算符优先级,则直接入栈。 4. 如果当前字符为左括号,直接入栈。 5. 如果当前字符为右括号,则依次弹出栈顶运算符并进行运算,直到遇到左括号为止,左括号出栈但不入栈。 6. 最后,依次弹出栈顶运算符并进行运算,直到栈为空,得出最终结果。 下面是用C语言实现中缀表达式求值代码: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_SIZE 100 typedef struct { int top; int data[MAX_SIZE]; } 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 val) { if (is_full(s)) { printf("Stack overflow\n"); exit(1); } s->data[++s->top] = val; } // 出栈 int pop(Stack *s) { if (is_empty(s)) { printf("Stack underflow\n"); exit(1); } return s->data[s->top--]; } // 获取栈顶元素 int peek(Stack *s) { if (is_empty(s)) { printf("Stack underflow\n"); exit(1); } return s->data[s->top]; } // 判断是否为运算符 int is_operator(char ch) { return ch == '+' || ch == '-' || ch == '*' || ch == '/'; } // 判断运算符优先级 int precedence(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } // 计算表达式 int evaluate(char *expr) { Stack op_stack, val_stack; init(&op_stack); init(&val_stack); int i, len, val, val1, val2; char ch, op; len = strlen(expr); for (i = 0; i < len; i++) { ch = expr[i]; if (isdigit(ch)) { val = ch - '0'; while (isdigit(expr[i+1])) { val = val * 10 + (expr[i+1] - '0'); i++; } push(&val_stack, val); } else if (is_operator(ch)) { while (!is_empty(&op_stack) && precedence(ch) <= precedence(peek(&op_stack))) { val1 = pop(&val_stack); val2 = pop(&val_stack); op = pop(&op_stack); if (op == '+') { push(&val_stack, val2 + val1); } else if (op == '-') { push(&val_stack, val2 - val1); } else if (op == '*') { push(&val_stack, val2 * val1); } else if (op == '/') { push(&val_stack, val2 / val1); } } push(&op_stack, ch); } else if (ch == '(') { push(&op_stack, ch); } else if (ch == ')') { while (peek(&op_stack) != '(') { val1 = pop(&val_stack); val2 = pop(&val_stack); op = pop(&op_stack); if (op == '+') { push(&val_stack, val2 + val1); } else if (op == '-') { push(&val_stack, val2 - val1); } else if (op == '*') { push(&val_stack, val2 * val1); } else if (op == '/') { push(&val_stack, val2 / val1); } } pop(&op_stack); } } while (!is_empty(&op_stack)) { val1 = pop(&val_stack); val2 = pop(&val_stack); op = pop(&op_stack); if (op == '+') { push(&val_stack, val2 + val1); } else if (op == '-') { push(&val_stack, val2 - val1); } else if (op == '*') { push(&val_stack, val2 * val1); } else if (op == '/') { push(&val_stack, val2 / val1); } } return pop(&val_stack); } int main() { char expr[MAX_SIZE]; printf("Enter an infix expression: "); fgets(expr, MAX_SIZE, stdin); int result = evaluate(expr); printf("Result: %d\n", result); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值