zoukankan      html  css  js  c++  java
  • 5-20 表达式转换 (25分)

    5-20 表达式转换 (25分)

    算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。 
    输入格式:

    输入在一行中给出不含空格的中缀表达式,可包含+、-、*、以及左右括号( ),表达式不超过20个字符。 
    输出格式:

    在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。 
    输入样例:

    2+3*(7-4)+8/4

    输出样例:

    2 3 7 4 - * + 8 4 / +


    代码:
      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<string.h>
      5 using namespace std;
      6 #define ERROR 0
      7 #define OK 1
      8 #define OVERFLOW -2
      9 #define TRUE 1
     10 #define FALSE 0
     11 typedef struct Node *ptr;
     12 typedef struct Node{
     13     int *base;//头指针
     14     int *top;//尾指针
     15     int stacksize;//最大容量
     16 }Sqstack;
     17 
     18 int InitStack(Sqstack &S)   //此处是构造一个空栈
     19 {
     20     S.base = (int *)malloc(100 *sizeof(int));
     21     if (!S.base)  exit(OVERFLOW);
     22     S.top = S.base;
     23     S.stacksize = 100;
     24     return OK;
     25 }
     26 int Push(Sqstack &S,char e)//入栈操作
     27 {
     28     if(S.top-S.base>=S.stacksize)
     29     {
     30         S.base=(int *)realloc(S.base,(S.stacksize+10)*sizeof(int));
     31         if(!S.base) exit(OVERFLOW);
     32         S.top=S.base+S.stacksize;
     33         S.stacksize+=10;
     34     }
     35     *S.top++=e;
     36     return OK;
     37 }
     38 char GetTop(Sqstack S,char &e)//返回头顶指针
     39 {
     40    if(S.top==S.base)
     41        return ERROR;
     42     else
     43         return e=*(S.top-1);
     44  }
     45 
     46 char Pop(Sqstack &S,char &e)
     47 {
     48     if(S.top==S.base)
     49         return ERROR;
     50     else
     51         return e=*--S.top;
     52 }
     53 
     54 int isoperator(char op)
     55 {
     56     switch(op)
     57     {
     58             case '+':
     59             case '-':
     60             case '*':
     61             case '/':
     62                      return 1;
     63             default:
     64                      return 0;
     65     }
     66 }
     67 
     68 int Priority(char op)
     69 {
     70     switch(op)
     71     {
     72         case '#':return -2;
     73         case '+':
     74         case '-':
     75             return 1;
     76         case '*':
     77         case '/':
     78             return 2;
     79         case '(': return -1;
     80         case ')': return 2;
     81         default: return -1;
     82     }
     83 }
     84 
     85 void postfix(char mid[],char post[],int len)//将中缀表达式转为后缀表达式
     86 {
     87     int i,j=0; char e;
     88     Sqstack abs;
     89     InitStack(abs);
     90     Push(abs,'#');
     91     for(i=0;i<len;i++)
     92     {
     93       if(mid[i]>='0'&&mid[i]<='9')
     94       {
     95           post[j]=mid[i];
     96           j++;
     97       }
     98       else if(isoperator(mid[i]))//如果接受到的符号是加减乘除的话
     99       {
    100           while(Priority(mid[i])<=Priority(GetTop(abs,e)))
    101           {
    102               post[j]=Pop(abs,e);
    103               j++;
    104           }
    105           while(Priority(mid[i])>Priority(GetTop(abs,e)))
    106               Push(abs,mid[i]);
    107         
    108       }
    109       else if(mid[i]=='(')
    110           Push(abs,mid[i]);
    111       else if(mid[i]==')')
    112       {
    113           while(GetTop(abs,e)!='(')
    114           {
    115               post[j]=Pop(abs,e);
    116               j++;
    117           }
    118           Pop(abs,e);
    119       }
    120     }
    121     while(GetTop(abs,e)!='#')
    122     {
    123         post[j]=Pop(abs,e);
    124         j++;
    125     }
    126 }
    127 int main()
    128 {
    129     char mid[21],post[21];
    130     int len;
    131     scanf("%s",mid);//输入一个中缀表达式
    132     len=(int)strlen(mid);
    133     postfix(mid,post,len);
    134     for(int i=0;i<len;i++)
    135     {
    136         cout<<post[i];
    137     }
    138     cout<<endl;
    139     return 0;
    140 }

    很惭愧,最后的结果没有通过所有的数据点,当然例子里面的数据是肯定没问题的,我不知道自己哪些情况没有考虑进去,如果你们发现了,欢迎在下面的评论区告诉我QAQ

    奇怪,我测试了我能想到的几乎所有情况,都是对的呀。。。。。 

  • 相关阅读:
    对数据劫持 OR 数据代理 的研究------------引用
    对React性能优化的研究-----------------引用
    对abel 转译 class 过程的研究----------------------引用
    对vue-router的研究--------------引用
    对JavaScript 引擎基础:原型优化的研究 -----------------------引用
    对vue源码之缓存的研究--------------引用
    对前端数据结构与算法的研究----------------引用
    正则表达式巩固_从别的资料上弄下来的
    十进制转换
    cmd 安装第三方库问题
  • 原文地址:https://www.cnblogs.com/guohaoyu110/p/6357920.html
Copyright © 2011-2022 走看看