ALGO-156 表达式计算

题目:http://lx.lanqiao.cn/problem.page?gpid=T419

万分感谢大佬 :https://blog.csdn.net/reidsc/article/details/54669433

#include<iostream>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
stack<char> s1,s2;
stack<int> s3;
int num[25];
char s[1005];
int priority(char ch){   //比较运算符 
	if(ch=='('||ch==')') return 1;
	if(ch=='+'||ch=='-') return 2;
	if(ch=='*'||ch=='/') return 3;
}
int Scal(int x,int y,char ch){  //计算 
	if(ch=='+') return x+y;
	if(ch=='-') return x-y;
	if(ch=='*') return x*y;
	if(ch=='/') return x/y;
} 
void  transla(int n){//中缀表达式转后缀表达式 
	 for(int i=0;i<n;i++){
	 	 if(s[i]>='0'&&s[i]<='9'){//字符为数字 
	 	 	    s2.push(s[i]); //入数字栈
	 	 	if(i+1<n&&(s[i+1]<'0'||s[i+1]>'9') ||i==n-1){ //当下个字符不是数字或者为最后一位时,加上分隔符 
		  	    s2.push('#'); 
			  }
			
		  }
		 else{
		 	if(s1.empty()||s[i]=='('|| priority(s[i])>priority(s1.top())){//如果是运算符,三种情况直接入栈 
		 		s1.push(s[i]);
			 }
			else if(s[i]==')'){//如果是右括号 
				while(s1.top()!='('){//将左括号之前的符号出栈,入栈2 
					s2.push(s1.top());
					s1.pop();
				}
				s1.pop();
			}
			else{//当运算符级别小于或者等于栈1栈顶运算符级别,将第一个大于当前运算符的运算符出栈,当前运算符进栈
			    while(!s1.empty()&&priority(s[i])<=priority(s1.top())&&s1.top()!='('){
			    	s2.push(s1.top());
					s1.pop(); 
				}
				s1.push(s[i]);
			} 
		 } 
	 }
	 while(!s1.empty()){//表达式结束 将栈1符号转移到栈2 
	 	s2.push(s1.top());
		 s1.pop(); 
	 } 
	 int k=0;
	 while(!s2.empty()){//将栈内数据放回字符串s中 
	 	s[k++]=s2.top();
	 	s2.pop();
	 }
	 reverse(s,s+k);//字符串反向
	 s[k]=0; 
} 
int Cal(int n)//后缀表达式计算    
{    
    int x,y,tmp=0,k=0;    
    for(int i=0;i<n;i++)       
        if(s[i]=='#')//是#直接跳过    
            continue;    
        else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')//是运算符弹出栈顶两元素计算后放回栈    
        {    
            x=s3.top();    
            s3.pop();    
            y=s3.top();    
            s3.pop();    
            x=Scal(y,x,s[i]);    
            s3.push(x);    
        }    
        else//是数字字符       
            if(s[i+1]=='#')//下一个元素是#    
            {    
                num[k++]=s[i]-'0';    
                for(int i=0;i<k;i++)    
                    tmp+=(num[i]*(int)pow(10,k-i-1));    
                s3.push(tmp);    
                tmp=0;    
                k=0;                    
            }    
            else//下一个元素不是#       
                num[k++]=s[i]-'0';                  
    return s3.top();    
}  
int main(){
	gets(s);
	transla(strlen(s));
	//cout<<s<<endl;
	cout<<Cal(strlen(s))<<endl;
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值