栈的应用:逆波兰表达式

栈的应用


逆波兰表达式的算法实现

中缀表达式转换为逆波兰表达式

void RPN(char str[]){           //此函数用来将中缀表达式转换为逆波兰表达式
    SqStackC S;     //建立一个栈用来存储待使用的运算符
    char res[MaxSize],x;
    int r=0;
    InitStackC(&S);       
    for(int i=0;str[i]!='\0';i++){          //遍历字符串
        if(str[i]>='0' && str[i]<='9'){          //如果是数字直接存入数组中
            res[r++]=str[i];
        } 
        else if(str[i] =='(' || StackEmptyC(S)){
            PushC(&S,str[i]);
        }
        else if(str[i] =='*' || str[i]=='/' || str[i]=='+' || str[i]=='-'){        //如果是运算符
            while(Compare(S.data[S.top])>=Compare(str[i])){         //此循环将栈顶向下所有优先级高于或等于此运算符的运算符弹出存入数组中
                res[r++]=S.data[S.top--];       
            }
            PushC(&S,str[i]);       //将此运算符压入栈中
        }
        else if(str[i]==')'){       //如果是')'符号
            while(S.data[S.top]!='('){      //将字符栈栈顶向下所有的运算符全部弹出并存入数组中,遇到'('停止
                res[r++]=S.data[S.top--];
            }
            S.top--;    //将'('弹出栈中,但不存入数组
        }
    }

    while(!StackEmptyC(S)){    //将栈中剩余的运算符依次存入数组
        PopC(&S,&x);
        res[r++]=x;
    }
    res[r]='\0';        //结尾处存入'\0'

    for(int i=0;res[i]!='\0';i++)     //输出逆波兰表达式
        printf("%c",res[i]);    
    putchar('\n');

    printf("%d",CalRPN(res));       //计算逆波兰表达式结果
}

计算逆波兰表达式

ElemType CalRPN(char str[]){        //此函数用来计算逆波兰表达式
    SqStack S;
    InitStack(&S);
    for(int i=0;str[i]!='\0';i++){          //遍历字符串
        if(str[i]>='0' && str[i]<='9')      //如果是数字则压入栈中
            Push(&S,str[i]-'0');
        else{
            ElemType a,b;
            Pop(&S,&b);         //弹出两个操作数
            Pop(&S,&a);
            switch(str[i]){         //根据运算符做出相应运算,并将结果压入栈中
                case '+':Push(&S,a+b);break;
                case '-':Push(&S,a-b);break;
                case '*':Push(&S,a*b);break;
                case '/':Push(&S,a/b);break;
            }
        }
    }
    ElemType r;
    Pop(&S,&r);       //弹出栈中唯一剩余的元素,此元素为运算结果
    return r;       //返回结果
} 

赋予运算符优先级

int Compare(char x){        
    if(x=='*' || x=='/')    //为各个运算符设置优先级
        return 2;
    if(x=='+' || x=='-')
        return 1;
    if(x=='(')
        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值