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

原题链接

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

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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值