输入一串四则运算字符串不含(),输出结果

面试碰见
Scanner scanner=new Scanner(System.in);
			StringBuffer buf=new StringBuffer();
			buf.append(scanner.next());
			String string=buf.toString();
			StringBuffer buff=new StringBuffer();
			for (int i = 0; i < string.length(); i++) {
				//因为string.split("")会把两位数以上的数拆分成个位数,所以采取人工隔离的方法拆分字符串
				if ('+'==(string.charAt(i))||'-'==(string.charAt(i))||'*'==(string.charAt(i))||
'/'==(string.charAt(i))) {
					buff.append(","+string.charAt(i)+",");
				}else {
					buff.append(string.charAt(i));
				}
			}
			List<Float> numlist=new ArrayList<Float>();
			List<Character> charlist=new ArrayList<Character>();
			List<String> list=new ArrayList<String>();
			String[] strings=buff.toString().split(",");
			for (String string2 : strings) {
				list.add(string2);
			}
			Iterator<String> it=list.iterator();
			int i=0;
			char operator='0';
			while (it.hasNext()) {
				String str=it.next();
				//如果本次迭代的是数字,则判断运算符里是否有*/?有则做运算,没有则存入numlist;
				if (!"+".equals(str)&&!"-".equals(str)&&!"*".equals(str)&&!"/".equals(str)) {
					switch (operator) {
					case '*':
						numlist.set(i-1,numlist.get(i-1)*Float.valueOf(str));
						operator='0';
						break;
					case '/':
						numlist.set(i-1,numlist.get(i-1)/Float.valueOf(str));
						operator='0';
						break;
					default:numlist.add(Float.valueOf(str));
						i++;
						break;
					}
				}else if ("+".equals(str)||"-".equals(str)) {
						charlist.add(str.charAt(0));
				}else if ("/".equals(str)) {
						operator=str.charAt(0);
				}else {
						operator=str.charAt(0);
					}
				}
			int c=0;
			Iterator<Character> it2=charlist.iterator();
			while (it2.hasNext()) {
				switch (it2.next()) {
				case '+':numlist.set(c, numlist.get(c)+numlist.get(c+1));
					numlist.remove(c+1);
					break;
				default:numlist.set(c, numlist.get(c)-numlist.get(c+1));
				numlist.remove(c+1);
					break;
				}
			}
			System.out.println(numlist.get(0));

因为看到别人是用stack实现的,所以试试其他方法。当然可以把每个功能拆分成一个类,这样在有括号的时候就方便反复调用其中的一些方法。---第一次发帖

#include<stdio.h> #include<stdlib.h> struct four { double a; struct four *next; //定义结构体,作为链表的节点. }; void main() { double sum(void); //函数声明. 该函数返回等式的计算结果. 有优先级的运算符号在函数内部先进行计算。 double sum1; printf("请输入等式,以 '=' 结束, 例如“ 2*2*3-2/2= ” 结果将自动保留六位有效数字\n"); sum1=sum(); printf("该等式的结果为:\t%f\n\n",sum1); } double sum(void) { struct four *head,*pnew,*ptail,*p,*q; //结构体成员. char ah; double s=0,last; //last作为 pnew->a 的前一个数值. int j=1; q=(struct four *)malloc(sizeof(struct four)); scanf("%lf%c",&q->a,&ah); last=q->a; while(j==1 && ah!='=') //头节点的建立. { switch(ah) //对运算符号的优先级进行选择,优先级高的先进行计算. { case '+': j=0; continue; break; case '-': j=0; continue; break; case '*': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last*q->a; break; case '/': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last/q->a; break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } last=q->a; scanf("%c",&ah); } pnew=(struct four *)malloc(sizeof(struct four)); pnew->a=q->a; //将头节点的信息传递给 head 和 ptail. head=ptail=pnew; while(ah!='=') //接下来节点的建立. { pnew=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&pnew->a); switch(ah) { case '*': pnew->a=last*pnew->a; break; case '/': pnew->a=last/pnew->a; break; case '+': break; case '-': pnew->a=-pnew->a;break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } scanf("%c",&ah); if(ah=='-' || ah=='+'|| ah=='=') //将值进行传递 ptail->next=pnew. { ptail->next=pnew; ptail=pnew; } last=pnew->a; } ptail->next=NULL; p=head; while(p!=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值