表达式求值--操作数大于9

问题描述
输入一个只包含加减乘除和括号的合法表达式,求表达式的值,其中除表示整除。

输入格式
输入一行,包含一个表达式。

输出格式
输出这个表达式的值。

样例输入
1-2+3*(4-5)

样例输出
-4

数据规模和约定

表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

代码如下: 表达式求值需将中缀表达式转换为后缀表达式


 //遍历表达式,分别将操作数与操作符存储在s1,s2栈中,
 //操作符进栈时需要判断优先级,若即将入栈的操作符  < 栈顶操作符的优先级,则取符(取后出栈)取数(取后出栈)进行运算,结果存入操作数栈。 否则,操作符入栈
 //直到表达式遍历完毕并且运算符栈为空时,结束循环。输出操作数栈中的值(最终值) 

#include <iostream>
#include <stack>
using namespace std;
string s;       //输入表达式 
stack<int>s1;  //存储操作数 
stack<char>s2;      //存储操作符 

//计算结果
int cal(int a,int b,char op){
	switch(op){
		case '+':	return a+b;
		case '-':   return a-b;
		case '*':   return a*b;
		case '/':   return a/b;
	}
} 
 //比较优先级      
char cmp(char a,char b){
    if(a=='#'){
			return '<';
		}
	if(a=='+'||a=='-'){
		if(b=='*'||b=='/'||b=='('){
			return '<';
		}else{
			return '>';
		}
	}
	if(a=='*'||a=='/'){
		if(b=='('){
			return '<';
		}else{
			return '>';
		}
	}
	if(a=='('){
		if(b==')'){
			return '=';
		}else{
			return '<';
		}
	}
} 

int main(){
	s2.push('#');
	cin>>s;
	int i=0,num=0;
	while(s2.top()!='#'||i<s.size()){    
	 
		if(s[i]>='0'&&s[i]<='9'){   //操作数 
			num=0;
			while(s[i]>='0'&&s[i]<='9'){     
				num*=10;
				num+=s[i]-'0';
			    i++;
			}
			s1.push(num);   //操作数入栈 
		}
		else{
			switch(cmp(s2.top(),s[i])){   //比较操作符优先级,
				case '<':
					s2.push(s[i]);     //操作符优先级大于栈顶,直接入栈
					i++;
					break;
				case '=':         
					s2.pop();       //左右括号相遇,左括号出栈 
					i++;
					break;
				case '>':                      
					int a=s1.top();    // 操作符优先级小于栈顶,出栈计算 
					s1.pop();
					int b=s1.top();
					s1.pop();
					s1.push(cal(b,a,s2.top()));     //b op  a  
					s2.pop();        //运算符出栈      
					break;
			}
		}
	}
	int res=s1.top();     //栈中存储的即为最后计算结果 
	s1.pop();
		cout<<res<<endl;
	return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

且听风吟~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值