求优化
  • 板块题目总版
  • 楼主2022zxh
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/11/6 12:50
  • 上次更新2023/10/27 04:04:31
查看原帖
求优化
695330
2022zxh楼主2022/11/6 12:50

站外题,要求输出多个带加减乘除括号的中缀表达式的值。代码效率太低,求原因和优化建议。

程序大纲

  • 数字:入栈
  • 左括号:入栈
  • 右括号:持续出栈直到遇到左括号
  • 运算符:前符为乘或除号则它出栈,入栈。
  • 加或减号:若前符为加或减号则它出栈。
//傻大个登场! 
#include<bits/stdc++.h>
using namespace std;
long double shu[11];
int st,ft;
char fu[11];
string a;
int main(){
	char s;
	int T;cin>>T;
	while(T--){
		a="";
		memset(shu,0,sizeof(shu));
		cin>>a;
		for(int i=0;i<a.length();i++){
			if(a[i]<='9'&&a[i]>='0'){
				int sou=0;
				while(a[i]<='9'&&a[i]>='0')sou=sou*10+(a[i++]-'0');
				i--;
				shu[++st]=sou;
			}
			else if(a[i]=='(')fu[++ft]='(';
			else if(a[i]==')'){//右括号 
				while(fu[ft]!='('){
					if(fu[ft]=='+'){
					    ft--;st--;
					    shu[st]+=shu[st+1];
				    }
				    else if(fu[ft]=='-'){
					    ft--;st--;
					    shu[st]-=shu[st+1];
				    }
				    else if(fu[ft]=='*'){
					    ft--;st--;
					    shu[st]*=shu[st+1];
				    }
				    else if(fu[ft]=='/'){
					    ft--;st--;
					    shu[st]/=shu[st+1];
				    }
				}
				ft--;//删左括号 
			}
			else{//运算符 
				if(fu[ft]=='*'){
					ft--;st--;
					shu[st]*=shu[st+1];
				}
				else if(fu[ft]=='/'){
					ft--;st--;
					shu[st]/=shu[st+1];
				}
				else{
					if(a[i]=='+'||a[i]=='-'){
						if(fu[ft]=='+'){
						    ft--;st--;
					        shu[st]+=shu[st+1];	
						}
						else if(fu[ft]=='-'){
						    ft--;st--;
					        shu[st]-=shu[st+1];	
						}
					}
				}
				fu[++ft]=a[i];
			}
		}
			while(ft>0){
				if(fu[ft]=='+'){
					ft--;st--;
					shu[st]+=shu[st+1];
				}
				else if(fu[ft]=='-'){
					    ft--;st--;
					    shu[st]-=shu[st+1];
				    }
				else if(fu[ft]=='*'){
					ft--;st--;
					shu[st]*=shu[st+1];
				}
				else if(fu[ft]=='/'){
					ft--;st--;
					shu[st]/=shu[st+1];
				}
			}
		cout<<(int)(shu[st])<<endl;
	}
}
2022/11/6 12:50
加载中...