逆波兰表达式

  逆波兰表达式,也叫后缀表达式,比如,表达式”(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);

}

效果如下:

逆波兰表达式_第1张图片
图(2) 逆波兰式:56 20 - 4 2 + /

你可能感兴趣的:(C++,struct,栈,逆波兰式)