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

 
时间: 2024-12-19 17:48:51

5-20 表达式转换 (25分)的相关文章

【表达式转换 (25 分)】

题目分析 首先规定优先级,括号为最高优先级,乘号或除号为次优先级,加或减号为最低优先级,至于数字,碰到就直接输出即可. 既然是数字,就有小数,整数,正数,负数之分,还有关于二元运算符的输出,在括号内的二元运算符优先输出,优先级高的优先输出(当然括号不算啊) 根据题意,在输出时可分为以下几种情况. (+1...... +1...... 对于正号,是不能输出的 -1...... 3 34... 3.4... (注意:上面的...指一堆未知长度的数字) 碰到 )符号,将与它对应的括号这之间的符号从栈内

7-20 表达式转换

7-20 表达式转换(25 分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中给出不含空格的中缀表达式,可包含+.-.*.\以及左右括号(),表达式不超过20个字符. 输出格式: 在一行中输出转换后的后缀表达式,要求不同对象(运算数.运算符号)之间以空格分隔,但结尾不得有多余空格. 输入样例: 2+3*(7-4)+8/4 输出样例: 2 3 7 4 -

中缀表达式转换前\后缀表达式的总结

本次个人程序设计要求做一个带有计算功能的程序,而要计算就离不开表达式,按照一般人的习惯,中缀表达式是一个非常常用的方式.但是,对于我们程序员来说,直接计算中缀表达式并不是那么方便,因此,通常来说我们会将中缀表达式进行转换. 不论是转成前缀表达式还是后缀表达式,通过树进行转换都是可以实现的,同时,一棵树就能完成前\中\后缀表达式的互相转换,因此如果仅仅要求转换并且频繁的转换,建立一棵树无疑是方便的.但是,对于计算而言,转换只是其中的一步,因此我们更要考虑效率问题,那么堆栈法就成了我们的首选.堆栈是

ZH奶酪:Python 中缀表达式转换后缀表达式

实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: (1)操作数:直接输出到pool (2)操作符:判断当前操作符与stack[top]操作符的优先级 <1>当前操作符优先级高于stack[top]:将当前操作符添加到stack中: <2>当前操作符优先级低于或等于stack[top]:从stack[top]开始出栈,直到stack[to

A1082 Read Number in Chinese (25)(25 分)

A1082 Read Number in Chinese (25)(25 分) Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output "Fu" first if it is negative. For example, -123456789 is read as "Fu yi Yi er Qian san B

4-9 二叉树的遍历 (25分)

4-9 二叉树的遍历   (25分) 输出样例(对于图中给出的树): Inorder: D B E F A G H C I Preorder: A B D F E C G H I Postorder: D E F B H G I C A Levelorder: A B C D F G I E H 代码:(都是遍历的算法) 1 // 4-9 二叉树的遍历 2 // 3 // Created by Haoyu Guo on 04/02/2017. 4 // Copyright ? 2017 Haoy

5-24 树种统计 (25分)

5-24 树种统计   (25分) 随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比. 输入格式: 输入首先给出正整数N(\le 10^5≤10?5??),随后N行,每行给出卫星观测到的一棵树的种类名称.种类名称由不超过30个英文字母和空格组成(大小写不区分). 输出格式: 按字典序递增输出各种树的种类名称及其所占总数的百分比,其间以空格分隔,保留小数点后4位. 输入样例: 29 Red Alder Ash Aspe

5-3 树的同构 (25分)

5-3 树的同构   (25分) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数NN (\le 10≤10),即该树的结点数(此时假设结点从0到N-1N?1编号):随后NN行,第i

用1分,5分,10分,25分,50分硬币凑成一元,总共有几种组合办法?(SQL 谜题)

早在ITPUB中看过有个SQL高手,喜欢出谜题,以下是一个谜题.我试用SQL SERVER解决此问题. 用1分,5分,10分,25分,50分硬币凑成一元,总共有几种组合办法? SELECT'1*'+rtrim(a.number) +'+5*'+rtrim(b.number) +'+10*'+rtrim(c.number) +'+25*'+rtrim(d.number) +'+50*'+rtrim(e.number)AS result FROM(select number from master.