返回

后缀表达式计算:揭秘高效代码实现的奥秘

闲谈

后缀表达式的概念和特性

后缀表达式,也称为逆波兰表示法,是一种运算符在操作数之后的表达式表示方法。这种表示方法具有以下特点:

  1. 简洁:后缀表达式不需要括号来指定运算符的优先级,因此更加简洁明了。
  2. 易于计算机计算:由于后缀表达式中运算符的位置固定,因此计算机可以很容易地进行计算。

后缀表达式的计算过程

计算后缀表达式通常使用栈数据结构。栈是一种先进后出的数据结构,可以方便地存储和检索数据。

  1. 将后缀表达式中的元素依次压入栈中。
  2. 当遇到一个操作数时,将其压入栈中。
  3. 当遇到一个运算符时,从栈中弹出两个操作数,进行运算,并将结果压入栈中。
  4. 重复步骤2和步骤3,直到将所有元素处理完毕。
  5. 栈顶元素即为后缀表达式的计算结果。

用C语言实现后缀表达式计算器

下面是一个用C语言实现的后缀表达式计算器的代码:

#include <stdio.h>
#include <stdlib.h>

// 定义栈的数据结构
typedef struct stack
{
    int *data;
    int top;
    int size;
} stack;

// 初始化栈
void init_stack(stack *s)
{
    s->data = (int *)malloc(sizeof(int) * 100);
    s->top = -1;
    s->size = 100;
}

// 入栈
void push(stack *s, int data)
{
    if (s->top == s->size - 1)
    {
        printf("栈已满!\n");
        return;
    }
    s->data[++s->top] = data;
}

// 出栈
int pop(stack *s)
{
    if (s->top == -1)
    {
        printf("栈已空!\n");
        return -1;
    }
    return s->data[s->top--];
}

// 计算后缀表达式
int evaluate_postfix(char *exp)
{
    stack s;
    init_stack(&s);

    int i = 0;
    while (exp[i] != '\0')
    {
        if (exp[i] >= '0' && exp[i] <= '9')
        {
            push(&s, exp[i] - '0');
        }
        else
        {
            int op1 = pop(&s);
            int op2 = pop(&s);
            switch (exp[i])
            {
            case '+':
                push(&s, op1 + op2);
                break;
            case '-':
                push(&s, op2 - op1);
                break;
            case '*':
                push(&s, op1 * op2);
                break;
            case '/':
                push(&s, op2 / op1);
                break;
            }
        }
        i++;
    }
    return pop(&s);
}

int main()
{
    char exp[] = "231*+9-";
    int result = evaluate_postfix(exp);
    printf("后缀表达式 '%s' 的计算结果为:%d\n", exp, result);
    return 0;
}

代码讲解

  1. 定义栈的数据结构:
typedef struct stack
{
    int *data;
    int top;
    int size;
} stack;
  1. 初始化栈:
void init_stack(stack *s)
{
    s->data = (int *)malloc(sizeof(int) * 100);
    s->top = -1;
    s->size = 100;
}
  1. 入栈:
void push(stack *s, int data)
{
    if (s->top == s->size - 1)
    {
        printf("栈已满!\n");
        return;
    }
    s->data[++s->top] = data;
}
  1. 出栈:
int pop(stack *s)
{
    if (s->top == -1)
    {
        printf("栈已空!\n");
        return -1;
    }
    return s->data[s->top--];
}
  1. 计算后缀表达式:
int evaluate_postfix(char *exp)
{
    stack s;
    init_stack(&s);

    int i = 0;
    while (exp[i] != '\0')
    {
        if (exp[i] >= '0' && exp[i] <= '9')
        {
            push(&s, exp[i] - '0');
        }
        else
        {
            int op1 = pop(&s);
            int op2 = pop(&s);
            switch (exp[i])
            {
            case '+':
                push(&s, op1 + op2);
                break;
            case '-':
                push(&s, op2 - op1);
                break;
            case '*':
                push(&s, op1 * op2);
                break;
            case '/':
                push(&s, op2 / op1);
                break;
            }
        }
        i++;
    }
    return pop(&s);
}
  1. 主函数:
int main()
{
    char exp[] = "231*+9-";
    int result = evaluate_postfix(exp);
    printf("后缀表达式 '%s' 的计算结果为:%d\n", exp, result);
    return 0;
}