四则运算(c++)

#include<bits/stdc++.h>
using namespace std;
//判断优先级
int primer(char a){
	if(a=='(') return 6;
	if(a == '*'|| a=='/') return 2;
	if(a==')') return 0;
	else return 1;
}

//计算
double count(double a, double b, char ch){
	if(ch == '+') return a+b;
	else if(ch == '-') return a-b;
	else if(ch == '*') return a*b;
	else if(ch == '/') return a/b;
}

//把字符串转为数字
double change(string s, int flag){
int i,n = s.size();
double shuzi1 = 0, shuzi2=0;

if(flag==0)for(i = n-1; i >=0;i-- ){
	shuzi1=shuzi1+(s[i]-'0')*pow(10,n-i-1);
}

else{
	string str1, str2;
	for(i=0;i<s.size();i++){
		if(s[i]!='.')str1.append(1,s[i]);
		else{
			i++;
			for(;i<s.size();i++){
				str2.append(1,s[i]);
			}
		}
	}
	
	for(i = str1.size()-1; i >=0;i-- ){
	shuzi1=shuzi1+(s[i]-'0')*pow(10,str1.size()-i-1);
}
int x=-1;
	for(i = 0; i < str2.size();i++ ){
	shuzi2=shuzi2+(str2[i]-'0')*pow(10,x);
x--;
}
		
}
return shuzi1+shuzi2;
}


int main(){
	printf("请输入要计算的表达式:");
stack<char>Stack;               //存运算符
 	string str, str2;           //str1读取字符串, str2存后缀表达式
	cin >> str;
int cnt = 0, i;
for(i = 0; i<str.size(); i++){
	char ch = str[i];
	
	//当读取到str1的运算符时
	if(ch=='+' || ch=='*' ||ch=='-' || ch=='/' || ch=='(' || ch==')'){    
		if(cnt == 0){
			Stack.push(ch);
			cnt++;
			continue;
		}
		if(Stack.empty()) Stack.push(ch);
		else if(primer(ch) > primer(Stack.top()))Stack.push(ch); //当准备入栈的运算符优先级>栈顶运算符优先级时
//当准备入栈的运算符优先级<=栈顶运算符优先级时
else {
	while(1){
		if(Stack.top()=='(') break;
		if(ch==')'){
		while(1){
			if(Stack.top()=='('){Stack.pop(); break;}
		str2.append(1,Stack.top());
     	Stack.pop();	
		}
	break;
		}
	str2.append(1,Stack.top());
	Stack.pop();	
	if(Stack.empty())break;
	if(primer(ch) > primer(Stack.top()))break;
	}
   if(ch!='('&&ch!=')')Stack.push(ch);
	
}
	}
	
	//当读取到str1的数字时
	else {
		str2.append(1,'#');
	   while(1){
	   	if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='\0')break;
	   	if(str[i]==')'){break;}
			str2.append(1,str[i]);
	   	 i++;
	   }
	   i--;
	  	str2.append(1,'#');
      	
}
}	
	while(!Stack.empty()){
		str2.append(1,Stack.top());
		Stack.pop();
}
printf("后缀表达式为:");
cout<<str2<<endl;

//str2 为后缀表达式
	stack<double>stack2;   //该栈存要运算的数字,当读取到str2的运算符时需要出栈两个数字运算后再入栈
	       i = 0;           //(注意:第2次出栈的数字+运算符+第1次出栈的数字,两个数字的运算顺序别整反了)
					  
	while(1){
		if(str2[i] == '+' || str2[i] == '-' || str2[i] == '*' || str2[i] == '/') {
			double a = stack2.top() ;
			stack2.pop();
			double b = stack2.top() ;
			stack2.pop();
			stack2.push(count(b, a, str2[i]));
		i++;
		}
		else {int count = i+1;
		int flag=0;
			string s;
			while(str2[count]!='#'){
				if(str2[count]=='.') flag = 1;
				s.append(1,str2[count]);
				count++;
			}
			i = count+1;
			stack2.push(change(s,flag));
		}
		if(i == str2.size())break;
	}
	printf("计算结果:");
	cout<<stack2.top();
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值