在C语言中,前缀和后缀表达式是两种常见的表达式表示方法,前缀表达式又称为波兰式(Polish Notation),它是一种运算符位于操作数之前的表达式形式,后缀表达式又称为逆波兰式(Reverse Polish Notation,RPN),它是一种运算符位于操作数之后的表达式形式,这两种表达式的计算方法有所不同,下面我们将详细介绍如何计算前缀和后缀表达式。

c语言   --前缀后缀怎么计算的c语言   --前缀后缀怎么计算的

(图片来源网络,侵删)

1、前缀表达式的计算

前缀表达式的计算过程是从左到右依次执行操作,首先需要将中缀表达式转换为前缀表达式,然后再进行计算,转换的方法是:将中缀表达式中的操作符提到操作数之前,然后去掉操作数和操作符之间的空格,将中缀表达式 "3 + 4" 转换为前缀表达式 "+ 3 4"。

下面是一个简单的前缀表达式计算函数:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#define MAX_SIZE 100
typedef struct {
    char data[MAX_SIZE];
    int top;
} Stack;
void push(Stack *stack, char value) {
    if (stack>top == MAX_SIZE 1) {
        printf("Stack overflow!
");
        return;
    }
    stack>data[++stack>top] = value;
}
char pop(Stack *stack) {
    if (stack>top == 1) {
        printf("Stack underflow!
");
        return '';
    }
    return stack>data[stack>top];
}
int is_empty(Stack *stack) {
    return stack>top == 1;
}
int precedence(char op) {
    switch (op) {
        case '+':
        case '':
            return 1;
        case '*':
        case '/':
            return 2;
        case '^':
            return 3;
        default:
            return 1;
    }
}
double evaluate_prefix(const char *expression) {
    Stack stack;
    stack.top = 1;
    int length = strlen(expression);
    for (int i = 0; i < length; i++) {
        char ch = expression[i];
        if (isdigit(ch)) {
            push(&stack, ch '0');
        } else if (isalpha(ch)) {
            double value = 0;
            while (!is_empty(&stack) && isdigit(pop(&stack))) {
                value = value * 10 + (pop(&stack) '0');
            }
            push(&stack, value);
        } else {
            while (!is_empty(&stack) && precedence(ch) <= precedence(pop(&stack))) {
                double b = pop(&stack);
                double a = pop(&stack);
                push(&stack, calculate(a, b, ch));
            }
            push(&stack, ch);
        }
    }
    while (!is_empty(&stack)) {
        double result = pop(&stack);
        push(&stack, result);
    }
    return pop(&stack);
}

2、后缀表达式的计算

后缀表达式的计算过程是从左到右依次扫描表达式,遇到操作数则入栈,遇到运算符则从栈中弹出两个操作数进行计算,然后将结果压入栈中,最后栈中只剩下一个元素,即为表达式的结果,需要注意的是,后缀表达式中不需要括号来表示优先级,而是通过运算符的顺序来确定。"3 4 +" 是一个合法的后缀表达式,表示 "3 + 4",为了避免歧义,通常建议使用空格其他符号来分隔操作数和运算符。"3 4 +" 可以改为 "3 4 + "。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。