数据结构与算法题目集7-20 表达式转换(c语言实现)

原题链接

  1. 这道题需要考虑负数和小数的情况,是否是数组我们用isnumber这个函数来判断。因为小数点不可能单独出现,所以我们认为小数点也是数字的一部分。
  2. 我们先用一个字符串存储这个表达式,如果当前的字符是数字的一部分,直接输出。
  3. 如果当前字符是正负号,那么进行如下判断。如果当前字符是第一个字符,那么肯定是数字的正负号;否则如果当前字符的前一个字符既不是 ‘)’ 也不是数字,那么它也是数字的正负号。
  4. 如果都不是前面两种情况就要做如下判断了。如果存储符号的堆栈是空的,那么直接将当前字符压到堆栈中;否则若当前符号是 ‘)’ 则出栈直至符号栈指向的元素为 ‘(’ ;若不是则在当前栈不为空的时候比较运算符的优先级,如果优先级当前高就退出循环,如果当前优先级低就输出栈顶符号,最后将当前元素压到栈中。
  5. 最后将符号栈中的所有元素全部输出

ac代码如下:

#include 
#include 
#include 
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;
}

你可能感兴趣的:(堆栈,PTA数据结构与算法题目集)