📜  门| GATE-CS-2003 |第 70 题(1)

📅  最后修改于: 2023-12-03 15:42:15.353000             🧑  作者: Mango

题目介绍

本题为2003年GATE-CS的第70题,在编程竞赛中经常被用作面试题目,属于经典程序设计问题。本题要求使用后缀表达式计算器,对给定的后缀表达式进行求值。

题目要求

给定一个后缀表达式,计算其结果。

输入格式

程序需要从标准输入中读取后缀表达式,一行一个表达式。每个表达式中的操作符和操作数均以一个空格分隔。

输出格式

程序需要将计算结果输出到标准输出中。

样例

输入:

3 4 *
5 +

输出:

17
编程思路

后缀表达式求值算法通常使用栈来实现,具体步骤如下:

  1. 从左到右扫描后缀表达式中的每个元素;
  2. 如果当前元素是操作数,则将其压入栈中;
  3. 如果当前元素是操作符,弹出栈顶的两个操作数,对它们进行运算并将结果压入栈中;
  4. 重复上述步骤,直到表达式结束,此时栈顶元素便是表达式的结果。
代码实现
#include <stdio.h>
#include <stdlib.h>

#define MAX_STACK_SIZE 100

typedef struct {
    int top;
    int data[MAX_STACK_SIZE];
} Stack;

/* 初始化栈 */
void initStack(Stack *s) {
    s->top = -1;
}

/* 判断栈是否为空 */
int isEmpty(Stack *s) {
    return s->top == -1;
}

/* 判断栈是否已满 */
int isFull(Stack *s) {
    return s->top == MAX_STACK_SIZE - 1;
}

/* 入栈操作 */
void push(Stack *s, int x) {
    if (isFull(s)) {
        printf("Error: stack is full\n");
        exit(-1);
    }
    s->data[++s->top] = x;
}

/* 弹出栈顶元素 */
int pop(Stack *s) {
    if (isEmpty(s)) {
        printf("Error: stack is empty\n");
        exit(-1);
    }
    return s->data[s->top--];
}

/* 获取栈顶元素 */
int peek(Stack *s) {
    if (isEmpty(s)) {
        printf("Error: stack is empty\n");
        exit(-1);
    }
    return s->data[s->top];
}

/* 将后缀表达式转换为计算结果 */
int evaluatePostfix(char *postfix) {
    Stack s;
    initStack(&s);  /* 初始化栈 */
    int i, a, b;

    for (i = 0; postfix[i] != '\0'; i++) {
        if (postfix[i] == ' ') {
            continue;
        }
        else if (isdigit(postfix[i])) {
            /* 如果是操作数,则直接压入栈中 */
            push(&s, postfix[i] - '0');
        }
        else {
            /* 如果是操作符,则弹出栈顶的两个元素进行计算,将计算结果压入栈中 */
            b = pop(&s);
            a = pop(&s);
            switch (postfix[i]) {
                case '+':
                    push(&s, a + b);
                    break;
                case '-':
                    push(&s, a - b);
                    break;
                case '*':
                    push(&s, a * b);
                    break;
                case '/':
                    push(&s, a / b);
                    break;
                case '%':
                    push(&s, a % b);
                    break;
                default:
                    printf("Error: invalid operator %c\n", postfix[i]);
                    exit(-1);
                    break;
            }
        }
    }

    /* 返回栈顶的结果 */
    return pop(&s);
}

int main() {
    char postfix[100];
    fgets(postfix, 100, stdin);
    printf("%d\n", evaluatePostfix(postfix));
    return 0;
}
总结

本题要求实现后缀表达式计算器,实现思路基本上就是利用栈来解决。程序的难点在于如何将后缀表达式转换为计算结果,具体过程中需要注意一些操作数和操作符的处理。