注册 登录
编程论坛 数据结构与算法

四则元算表达式转换为逆波兰式(符号)

李小小小 发布于 2015-10-04 21:38, 4438 次点击
描述:
    假设表达式由单字母整数类型变量和双目四则运算符构成("+","-","*","/"),写一个程序,将一个通常书写形式且书写正确的表达式转换为逆波兰式。

输入:
    输入一个完整的正确的四则运算表达式,长度不超过100(其中仅含有:"("、")"、"a"、"b"和"c"五种字符)。

输出:
    输出这个表达式的逆波兰表达式。注意结尾带回车。

输入样例:
    输入样例一:(a+b)
    输入样例二:((a+b)*(a-c))
    输入样例三:((a*(b+c))-(a/c))

输出样例:
    输出样例一:ab+
    输出样例二:ab+ac-*
    输出样例三:abc+*ac/-
5 回复
#2
李小小小2015-10-04 21:45
哪位大神帮忙做一下吧
#3
林月儿2015-10-04 21:55
自己先写,然后让别人改
#4
李小小小2015-10-04 22:37
void pop(SqStack &S,int &e){
    if(S.base!=S.top) e=*--S.top;
}
这一段有什么问题呀?调试的时候一直显示错误
#5
李小小小2015-10-04 22:40
我自己写的代码,大家帮忙找找错误,运行结果是乱码:
#include <stdio.h>
#include <malloc.h>
#define S_SIZE 100
#define STACKINCREAMENT 10
struct SqStack{
    int *base;
    int *top;
    int stacksize;
};
void InitStack(SqStack &S){
    S.base=(int*)malloc(S_SIZE*sizeof(int));
    S.top=S.base;
    S.stacksize=S_SIZE;
}
int StackEmpty(SqStack S){
    if(S.base==S.top)return 1;
    else return 0;
}
void GetTop(SqStack &S,int &e){
    e=*(S.top--);
}
void push(SqStack &S,int e){
    if(S.top-S.base>=S.stacksize){
        S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREAMENT;
    }
    *S.top++=e;
}
void pop(SqStack &S,int &e){
    if(S.base!=S.top) e=*--S.top;
}
void InversePolandExpression(char Buffer[],int i){
    SqStack s,t;
    InitStack(s);
    InitStack(t);
    int j=0,e,A[10],h=0,l=0;
    for(j=0;j<i;j++){
        if(Buffer[j]=='(') {
            push(s,Buffer[j]);
            push(t,Buffer[j]);
        }
        else if(Buffer[j]=='a'||Buffer[j]=='b'||Buffer[j]=='c')
                 push(s,Buffer[j]);
             else{
                if(Buffer[j]=='+'||Buffer[j]=='-'||Buffer[j]=='*'||Buffer[j]=='/')
                    push(t,Buffer[j]);
                if(e!=')') {
                    GetTop(s,e);
                    while(e!='('){
                        A[h]=e;
                        h++;
                        pop(s,e);
                        GetTop(s,e);
                    }
                    pop(s,e);
                    for(l=h-1;l>-1;l--)printf("%d",A[l]);
                    GetTop(t,e);
                    while(e!='('){
                        printf("%d",e);
                        pop(t,e);
                        GetTop(t,e);
                    }
                    pop(t,e);
                }
            }
    }
}
int main()
{
    int i=0;
    char Buffer[100];
    gets(Buffer);
    while(Buffer[i]) i++;
    InversePolandExpression(Buffer,i);
    return 0;
}
#6
李小小小2015-10-05 12:27
哪位亲可以帮忙看一下,下面是我用数组做的,帮忙找找错,好吗

#include <stdio.h>
#include <math.h>
void InversePolandExpression(char Buffer[],int i){
    int j=0,h=0,l=0,m=0,p=0,n=0;
    char A[50],B[50],C[50],D[50];
    for(j=0;j<i;j++){
        if(Buffer[j]=='(') {
            A[h]=Buffer[j];
            h++;
            B[l]=Buffer[j];
            l++;
        }
        if(Buffer[j]=='a'||Buffer[j]=='b'||Buffer[j]=='c'){
            A[h]=Buffer[j];
            h++;
        }
        if(Buffer[j]=='+'||Buffer[j]=='-'||Buffer[j]=='*'||Buffer[j]=='/'){
            B[l]=Buffer[j];
            l++;
        }
        if(Buffer[j]==')') {
            while(A[h]!='('){
                C[p]=A[h];
                p++;
                h--;
            }
            h--;
            m=p;
            for(p=m-1;p>0;p--) printf("%c",C[p]);
            while(B[l]!='('){
                D[n]=B[l];
                n++;
                l--;
            }
            l--;
            m=n;
            for(n=1;n<m;n++) printf("%c",D[n]);
        }
    }
}
int main()
{
    int i=0;
    char Buffer[100];
    gets(Buffer);
    while(Buffer[i]) i++;
    InversePolandExpression(Buffer,i);
    return 0;
}
1