📜  门| GATE-IT-2004 |第 63 题(1)

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

门| GATE-IT-2004 |第 63题

介绍

本题是一个计算机科学方面的问题,是印度GATE-IT-2004考试的一道题目。该题要求通过C语言实现Infix表达式转换为Postfix表达式的算法,并进行单元测试。

算法描述

Infix表达式:将操作符(加号、减号、乘号、除号)放置在操作数之间的表达式,如(a+b*c)/(d+e)

Postfix表达式:将操作符放置在操作数之后的表达式,也称为Reverse Polish Notation (RPN)表达式,如a b c * + d e + /

  • 从左到右扫描Infix表达式
  • 若当前字符为操作数,直接输出该字符
  • 若当前字符为运算符,则分三种情况讨论:
    • 栈为空,直接将该运算符压入栈
    • 栈顶运算符的优先级比当前运算符优先级高或相等,则将栈顶运算符弹出并输出,直到栈顶运算符优先级比当前运算符低
    • 将当前运算符压入栈
  • 若当前字符为左括号,则将其压入栈
  • 若当前字符为右括号,则依次把栈顶元素弹出并输出,直到遇到左括号为止。左括号只弹出不输出
  • 扫描完毕,将栈中剩余的运算符依次弹出并输出

示例:

输入:(a+b)*c

输出:a b + c *

单元测试

单元测试可以保证算法正确性,可使用Google Test进行测试。测试点应包括:

  • 中缀表达式中包含无效字符(如空格、非法字符)
  • 中缀表达式包含括号不匹配的情况
  • 中缀表达式包含多个运算符的组合(如a+b-c*d/e)
  • 中缀表达式只包含一个操作数的情况
  • 中缀表达式为空字符串的情况
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 100

// 定义栈
typedef struct {
    char data[MAX_SIZE];
    int top;
} Stack;

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

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

// 判断栈是否已满
int is_full(Stack *stack) {
    return stack->top == MAX_SIZE - 1;
}

// 入栈操作
void push(Stack *stack, char value) {
    if (is_full(stack)) {
        printf("Stack full\n");
        exit(EXIT_FAILURE);
    }
    stack->data[++stack->top] = value;
}

// 出栈操作
char pop(Stack *stack) {
    if (is_empty(stack)) {
        printf("Stack empty\n");
        exit(EXIT_FAILURE);
    }
    return stack->data[stack->top--];
}

// 获取栈顶元素
char get_top(Stack *stack) {
    if (is_empty(stack)) {
        printf("Stack empty\n");
        exit(EXIT_FAILURE);
    }
    return stack->data[stack->top];
}

// 判断是否为操作符
int is_operator(char c) {
    return c == '+' || c == '-' || c == '*' || c == '/';
}

// 获取操作符优先级
int get_priority(char c) {
    switch (c) {
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        default:
            return 0;
    }
}

// 中缀表达式转换为后缀表达式
void infix2postfix(char *infix, char *postfix) {
    Stack stack;
    init(&stack);
    int len = strlen(infix);
    int index = 0;
    for (int i = 0; i < len; i++) {
        char c = infix[i];
        if (is_operator(c)) {
            while (!is_empty(&stack) && get_priority(get_top(&stack)) >= get_priority(c)) {
                postfix[index++] = pop(&stack);
            }
            push(&stack, c);
        } else if (c == '(') {
            push(&stack, c);
        } else if (c == ')') {
            while (!is_empty(&stack) && get_top(&stack) != '(') {
                postfix[index++] = pop(&stack);
            }
            if (!is_empty(&stack) && get_top(&stack) == '(') {
                pop(&stack);
            }
        } else {
            postfix[index++] = c;
        }
    }
    while (!is_empty(&stack)) {
        postfix[index++] = pop(&stack);
    }
    postfix[index] = '\0';
}

int main() {
    char infix[MAX_SIZE];
    printf("Please input the infix expression: ");
    scanf("%s", infix);
    char postfix[MAX_SIZE];
    infix2postfix(infix, postfix);
    printf("The postfix expression is: %s\n", postfix);
    return 0;
}

以上就是本题的详细介绍,包括算法描述、单元测试和代码实现。如有疑问,欢迎留言与我交流!