其他分享
首页 > 其他分享> > SWUST OJ 1042: 中缀表达式转换为后缀表达式

SWUST OJ 1042: 中缀表达式转换为后缀表达式

作者:互联网

题目描述

中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将中缀表达式转换为后缀表达式。(测试数据元素为单个字符)

输入

中缀表达式

输出

后缀表达式

样例输入

A+(B-C/D)*E

样例输出

ABCD/-E*+

参考程序

#include<stdio.h>
#include<stdlib.h>
struct stack
{
    char date[222];
    int top;
};
struct NODE
{
    char exp;
    int pri;
}lpri[]={{'=',0},{'+',3},{'-',3},{'*',5},{'/',5},{'(',1},{')',6}},
rpri[]={{'=',0},{'+',2},{'-',2},{'*',4},{'/',4},{'(',6},{')',1}};
char e;
void push(struct stack *s,char c)
{
    s->top++;
    s->date[s->top]=c;
}
void pop(struct stack *s)
{
    e=s->date[s->top];
    s->top--;
}
int right(char c)
{
    int i;
    for(i=0;i<7;i++)
    {
        if(rpri[i].exp==c)
            return  rpri[i].pri;
    }
}
int left(char c)
{
    int i;
    for(i=0;i<7;i++)
    {
        if(lpri[i].exp==c)
            return  lpri[i].pri;
    }
}
int main()
{
    char ch[222],num[222];;
    int k=0;
    struct stack *s;
    s=(struct stack *)malloc(sizeof(struct stack));
    s->top=-1;
    scanf("%s",ch);
    int i=0;
    push(s,'=');
    for(i=0;ch[i]!='\0';i++)
    {
        if(ch[i]>='A'&&ch[i]<='Z')
        {
            num[k]=ch[i];
            k++;
        }
        else
        {
            if(right(ch[i])>left(s->date[s->top]))
                push(s,ch[i]);
            else if(right(ch[i])<left(s->date[s->top]))
            {
                pop(s);
                num[k]=e;
                k++;
                i--;
                 
            }
            else
                pop(s);
        }
    }
    while(s->top!=0)
    {
        pop(s);
        num[k]=e;
        k++;
    }
    for(i=0;i<k;i++)
        printf("%c",num[i]);
    return 0;
}

注意

该程序仅供学习参考!

标签:1042,ch,中缀,int,top,char,表达式,struct
来源: https://blog.csdn.net/qq_29711355/article/details/122310875