逆波兰表达式

来源:互联网 发布:linux退出vi编辑命令 编辑:程序博客网 时间:2024/05/22 03:20

  逆波兰表达式,也叫后缀表达式,比如,表达式”(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转换为后缀表达式postexpvoid 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 + /

0 0