从中缀向后缀转换表达式

问题描述

  中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式

(A 一 (B*C 十 D)*E) / (F 十 G )

转换为后缀表示为:

ABC*D十E*--FG十/

注意:为了简化编程实现,假定变量名均为单个字母,运算符只有+,-,*,/ 和^(指数运算),可以处理圆括号(),并假定输入的算术表达式正确。

要求:使用栈数据结构实现 ,输入的中缀表达式以#号结束

输入

整数N。表示下面有N个中缀表达式
N个由单个字母和运算符构成的表达式

输出

N个后缀表达式。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 1↵
  2. (A-(B*C+D)*E)/(F+G)#↵
以文本方式显示
  1. ABC*D+E*-FG+/↵
1秒64M0
测试用例 2以文本方式显示
  1. 2↵
  2. a+b*c-d#↵
  3. a-b*(c+d)#↵
以文本方式显示
  1. abc*+d-↵
  2. abcd+*-↵
1秒64M

代码如下:

 (感觉同一类型实际上每次写都会有很多重复的地方,打算每个结构存一下常用的自定义函数)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct
{
    char data[MAX_SIZE];
    int top;
} Stack;
void push(Stack *stack, char item)
{
    stack->data[++stack->top] = item;
}
char pop(Stack *stack)
{
    return stack->data[stack->top--];
}
char peek(Stack *stack)
{
    return stack->data[stack->top];
}
int get_Pre(char c)
{
    if (c == '^')
        return 3;
    else if (c == '*' || c == '/')
        return 2;
    else if (c == '+' || c == '-')
        return 1;
    else
        return 0;
}
char *in_to_post(const char *in)
{
    Stack stk = {.top = -1};
    char *post = (char *)malloc(MAX_SIZE * sizeof(char));
    int post_index = 0;
    for (int i = 0; i < strlen(in); i++)
    {
        char c = in[i];
        if (isalpha(c))
            post[post_index++] = c;
        else if (c == '(' || c == '^')
            push(&stk, c);
        else if (c == ')')
        {
            while (peek(&stk) != '(')
                post[post_index++] = pop(&stk);
            pop(&stk);
        }
        else if (strchr("+-*/^", c))
        {
            while (stk.top != -1 && peek(&stk) != '(' && get_Pre(c) <= get_Pre(peek(&stk)))
                post[post_index++] = pop(&stk);
            push(&stk, c);
        }
    }
    while (stk.top != -1)
        post[post_index++] = pop(&stk);
    post[post_index] = '\0';
    return post;
}
int main()
{
    int N;
    scanf("%d", &N);
    getchar();
    for (int i = 0; i < N; i++)
    {
        char in[MAX_SIZE];
        fgets(in, MAX_SIZE, stdin);
        in[strcspn(in, "\n")] = '\0';
        char *post = in_to_post(in);
        printf("%s\n", post);
        free(post);
    }
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值