作者:阳光下微醺的我 | 来源:互联网 | 2023-10-13 07:54
表达式转换算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后
表达式转换 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式: 输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式: 在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
知识点:将中缀表达式转化为后缀表达式: 两种情况: (1)没有括号的中缀表达式转化为后缀表达式:
(2)带有括号的中缀表达式转化为后缀表达式:
分析:本题是带有括号的中缀表达式,需要利用第二种方式实现,模拟过程我会在代码上详解 这里说一下这道题的细节问题: 中缀表达式转换为后缀表达式:对于本题而言,细节过多,在完成表达式转换的基础上 1.需要控制空格,首尾不能出现空格 2.需要判断一位以上的数字之间不能有空格 3.需要判断小数的情况,注意之间不能有空格 4.需要判断镶嵌括号的情况,容易出现格式错误 例如:当一开始就输入多个空格会使首位出现空格 5.需要判断正负号 (1)对于正号,当出现在第一位时需直接特判(在第一位无需加括号) 未在第一位出现正号一定会在括号内,而且输出时正号要省略 (2)对于负号,当出现在第一位时需要直接特判(在第一位出现无需加括号) 未在第一位出现负号一定会在括号内,需要输出负号 (3)注意控制好空格,防止格式错误
下面是代码:
#include #include #include #include #include using namespace std; const int M&#61; 1010 ; char str[ M] , st[ M] , c; stack< char > q; int main ( ) { int i, j, k&#61; 0 , l, m, n, f&#61; 0 , t&#61; 0 , ff&#61; 0 ; cin. getline ( str, 110 ) ; l&#61; strlen ( str) ; for ( i&#61; 0 ; i< l; i&#43;&#43; ) { if ( str[ i] >&#61; &#39;0&#39; && str[ i] <&#61; &#39;9&#39; ) { t&#61; 1 ; if ( ff&#61;&#61; 0 ) { printf ( "%c" , str[ i] ) ; ff&#61; 1 ; f&#61; 0 ; continue ; } if ( f&#61;&#61; 0 ) printf ( "%c" , str[ i] ) ; else { printf ( " %c" , str[ i] ) ; f&#61; 0 ; } } else if ( str[ i] &#61;&#61; &#39;.&#39; ) { printf ( "%c" , str[ i] ) ; } else if ( i&#61;&#61; 0 && str[ i] &#61;&#61; &#39;&#43;&#39; ) { printf ( "%c" , str[ i] ) ; } else if ( i&#61;&#61; 0 && str[ i] &#61;&#61; &#39;-&#39; ) { printf ( "%c" , str[ i] ) ; } else if ( str[ i] &#61;&#61; &#39;(&#39; && str[ i&#43; 1 ] &#61;&#61; &#39;-&#39; ) { if ( t&#61;&#61; 1 ) printf ( " %c" , str[ i&#43; 1 ] ) ; else printf ( "%c" , str[ i&#43; 1 ] ) ; q. push ( str[ i] ) ; f&#61; 0 ; i&#43;&#43; ; } else if ( str[ i] &#61;&#61; &#39;(&#39; && str[ i&#43; 1 ] &#61;&#61; &#39;&#43;&#39; ) { q. push ( str[ i] ) ; f&#61; 1 ; i&#43;&#43; ; } else if ( str[ i] &#61;&#61; &#39;(&#39; ) { q. push ( str[ i] ) ; f&#61; 1 ; } else if ( str[ i] &#61;&#61; &#39;)&#39; ) { while ( q. top ( ) !&#61; &#39;(&#39; ) { printf ( " %c" , q. top ( ) ) ; f&#61; 1 ; q. pop ( ) ; } q. pop ( ) ; } else { if ( q. size ( ) &#61;&#61; 0 || q. top ( ) &#61;&#61; &#39;(&#39; ) { f&#61; 1 ; q. push ( str[ i] ) ; } else if ( ( str[ i] &#61;&#61; &#39;*&#39; || str[ i] &#61;&#61; &#39;/&#39; ) && ( q. top ( ) &#61;&#61; &#39;&#43;&#39; || q. top ( ) &#61;&#61; &#39;-&#39; ) ) { f&#61; 1 ; q. push ( str[ i] ) ; } else { if ( q. top ( ) &#61;&#61; &#39;*&#39; || q. top ( ) &#61;&#61; &#39;/&#39; ) { f&#61; 1 ; printf ( " %c" , q. top ( ) ) ; q. pop ( ) ; if ( q. size ( ) &#61;&#61; 0 || q. top ( ) &#61;&#61; &#39;(&#39; ) { f&#61; 1 ; q. push ( str[ i] ) ; } else if ( str[ i] &#61;&#61; &#39;*&#39; || str[ i] &#61;&#61; &#39;/&#39; ) { f&#61; 1 ; q. push ( str[ i] ) ; } else if ( str[ i] &#61;&#61; &#39;&#43;&#39; || str[ i] &#61;&#61; &#39;-&#39; ) { f&#61; 1 ; printf ( " %c" , q. top ( ) ) ; q. pop ( ) ; q. push ( str[ i] ) ; } } else if ( q. top ( ) &#61;&#61; &#39;&#43;&#39; || q. top ( ) &#61;&#61; &#39;-&#39; ) { if ( str[ i] &#61;&#61; &#39;*&#39; || str[ i] &#61;&#61; &#39;/&#39; ) { f&#61; 1 ; q. push ( str[ i] ) ; } else if ( str[ i] &#61;&#61; &#39;&#43;&#39; || str[ i] &#61;&#61; &#39;-&#39; ) { f&#61; 1 ; printf ( " %c" , q. top ( ) ) ; q. pop ( ) ; q. push ( str[ i] ) ; } } } } } while ( q. size ( ) !&#61; 0 ) { printf ( " %c" , q. top ( ) ) ; q. pop ( ) ; } printf ( "\n" ) ; return 0 ; }