数据结构-堆栈队列-表达式转换

7-3 表达式转换 (25 分)

时间限制: 400 ms             内存限制: 64 MB          代码长度限制: 16 KB

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char stack[30];
int top=-1;
int getnum(char data[],int loc)//返回此运算数的字符形式有几个字符
{
    if((data[loc]=='-'||data[loc]=='+')&&loc-1>=0&&(isdigit(data[loc-1])||data[loc-1]==')'))
	//+和-的特殊情况,此时为运算符,不是符号
        return 0;
    int count=0;
    if(data[loc]=='-'||data[loc]=='+'){
        count++;
        loc++;
    }
    while(data[loc]&&strchr("+-*/()",data[loc])==NULL){
        count++;
        loc++;
    }
    return count;
}
void deal(char ch)
{
    if(ch=='+'){
        while(top>=0&&stack[top]!='(')
            printf(" %c",stack[top--]);
        stack[++top]='+';
    }
    else if(ch=='-'){
        while(top>=0&&stack[top]!='(')
            printf(" %c",stack[top--]);
        stack[++top]='-';
    }
    else if(ch=='*'){
        while(top>=0&&stack[top]!='('&&stack[top]!='+'&&stack[top]!='-')
            printf(" %c",stack[top--]);
        stack[++top]='*';
    }
    else if(ch=='/'){
        while(top>=0&&stack[top]!='('&&stack[top]!='+'&&stack[top]!='-')
            printf(" %c",stack[top--]);
        stack[++top]='/';

    }
    return;
}//判断运算符的优先级,如果栈top运算符优先度大于或等于当前运算符,top出栈,再将当前运算符压栈
int main()
{
    int i,j;
    int flag=0;//用来判断此字符前输不输出空格
    char data[30];//原始数据
    gets(data);
    for(i=0;data[i];i++){
        int num;
        if((num=getnum(data,i))!=0){//如果为运算数
            char temp[30];//存运算数的字符串形式
            for(j=0;j<num;j++)
                temp[j]=data[i+j];
            temp[j]='\n';
            i=i+num-1;
            double result=atof(temp);
            if(flag)
              printf(" %g",result);
            else
              printf("%g",result);
            flag=1;            
        }
        else if(data[i]=='(')
            stack[++top]='(';//(入栈
        else if(data[i]==')'){//()内运算符出栈
            while(stack[top]!='('){
                printf(" %c",stack[top--]);
            }
            top--;
        }
        else if(strchr("+-*/",data[i])!=NULL){//为运算符
            deal(data[i]);
        }
    }
    for(int i=top;i>=0;i--)//弹出栈内剩余运算符
        printf(" %c",stack[i]);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值