- 这道题需要考虑负数和小数的情况,是否是数组我们用isnumber这个函数来判断。因为小数点不可能单独出现,所以我们认为小数点也是数字的一部分。
- 我们先用一个字符串存储这个表达式,如果当前的字符是数字的一部分,直接输出。
- 如果当前字符是正负号,那么进行如下判断。如果当前字符是第一个字符,那么肯定是数字的正负号;否则如果当前字符的前一个字符既不是 ‘)’ 也不是数字,那么它也是数字的正负号。
- 如果都不是前面两种情况就要做如下判断了。如果存储符号的堆栈是空的,那么直接将当前字符压到堆栈中;否则若当前符号是 ‘)’ 则出栈直至符号栈指向的元素为 ‘(’ ;若不是则在当前栈不为空的时候比较运算符的优先级,如果优先级当前高就退出循环,如果当前优先级低就输出栈顶符号,最后将当前元素压到栈中。
- 最后将符号栈中的所有元素全部输出
ac代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int isnumber(char c){
if(c>='0' && c<='9' || c=='.'){
return 1;
}else{
return 0;
}
}
int zf(char c){
if(c=='-' || c=='+'){
return 1;
}else{
return 0;
}
}
int compare(char a,char b){
if(b==')'){
return 1;
}
if(a=='(' || b=='('){
return 0;
}
if(b=='+' || b=='-'){
return 1;
}else{
if(a=='-' || a=='+'){
return 0;
}else{
return 1;
}
}
}
int main(){
char str1[31],str2[31];
scanf("%s",str1);
int len=strlen(str1),i,j,space=0,top=0;
for(i=0;i<len;i++){
if(isnumber(str1[i])){
if(space){
printf(" ");
space=0;
}
printf("%c",str1[i]);
}else if(zf(str1[i]) && (i?(str1[i-1]!=')' && !isnumber(str1[i-1])):1)){
if(str1[i]=='-'){
if(space){
printf(" ");
space=0;
}
printf("%c",str1[i]);
}
}else{
if(top){
if(str1[i]==')'){
while(top--){
if(str2[top]=='('){
break;
}else{
printf(" %c",str2[top]);
}
}
}else{
while(top){
if(compare(str2[top-1],str1[i])){
printf(" %c",str2[--top]);
}else{
break;
}
}
str2[top++]=str1[i];
}
}else{
str2[top++]=str1[i];
}
for(j=0;j<top;j++){
if(str2[j]!='('){
space=1;
break;
}
}
}
}
while(top){
printf(" %c",str2[--top]);
}
return 0;
}