逆波兰表达式

57 篇文章 1 订阅
52 篇文章 2 订阅

  逆波兰表达式,也叫后缀表达式,比如,表达式”(56-20)/(4+2)”的逆波兰表达式为“56 20 - 4 2 + /”。将算术表达式用一颗二叉树表示,然后后序遍历该二叉树,即可得到它的逆波兰表达式。如图(1)所示:
  

这里写图片描述

  可以用栈将算法表达式转化为逆波兰式,代码如下:
  

#include <stdio.h>
#define MaxSize 100

//符号栈
struct{
    char data[MaxSize];
    int top;
}op;

//数值栈
struct{
    float data[MaxSize];
    int top;
}st;


//将算术表达式exp转换为后缀表达式postexp
void trans(char exp[],char postexp[]){
    char ch;
    int i=0,j=0; //i扫描exp的下标,j扫描postexp的下标
    op.top=-1;
    ch=exp[i]; i++;
    while (ch != '\0')
    {
        switch(ch){
        case '(':    //左括号
            op.top++; op.data[op.top]=ch;
            break;
        case ')':   //右括号
            while(op.data[op.top]!='(')
            {
                postexp[j]=op.data[op.top]; j++;
                op.top--;
            }
            op.top--;
            break;
        case '+':   //为'+'或'-'时,其优先级不大于栈顶任何运算符的优先级,直到')'
        case '-':
            while (op.top!=-1 && op.data[op.top]!='(')
            {
                postexp[j]=op.data[op.top]; j++;
                op.top--;
            }
            op.top++; op.data[op.top]=ch;
            break;
        case '*':
        case '/':  //为'*'或'/'时,其优先级不大于栈顶为'*'或'/'的优先级,直到')'
            while(op.top!=-1 && op.data[op.top]!='('
                && (op.data[op.top]=='*' || op.data[op.top]=='/')){
                postexp[j]=op.data[op.top]; j++;
                op.top--;
            }
            op.top++; op.data[op.top]=ch;
            break;
        case ' ': break;  //过滤空格
        default:
            while (ch>='0' && ch<='9')
            {
                postexp[j]=ch; j++;
                ch=exp[i]; i++;
            }
            i--;
            //postexp[j]='#'; j++;
            postexp[j]=' '; j++; //用空格标识一个数值串结束

        }
        ch=exp[i]; i++;
    }

    while(op.top!=-1){ //此时,exp扫描完毕,栈不空时出栈并存放到postexp中
        postexp[j]=op.data[op.top]; j++;
        op.top--;
    }
    postexp[j]='\0'; //给postexp表达式添加结束标识

}
void main()
{
    char exp[20]="(56-20)/(4-2)";
    char postexp[30];

    //求exp的逆波兰式
    trans(exp,postexp);
    printf("表达式 %s 逆波兰式如下:\n",exp);
    printf("%s\n",postexp);

}

效果如下:

这里写图片描述

图(2) 逆波兰式:56 20 - 4 2 + /

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值