表达式求值(等级差值法)--实现加减乘除

学完数据结构的 栈 后自己的写法

例如
(1+1)*(2+2)
结果
8

//用两个堆栈实现 x用来存数字,y 用来存运算符 
//至少实现两种运算操作 1:数字的运算,2:运算符的比较 
//在运算过程中是那边运算边存储在四则运算中数字栈中会保持在三个是以内 
//数字运算时 字符转化成数字,
//运算符比较需要定义优先级 (等级差值法)
#include<iostream>
#include<stack> 

using namespace std;

stack<int> x;
stack<char> y;

//数字运算
void sys()
{   //a是后面的元素,c是栈顶元素 
	char b;
	b=y.top();
	y.pop(); 
	int a,c;
	c=x.top();
	x.pop();
	a=x.top();
	x.pop();
	int zhi;	
	if(b=='+')
	{
		zhi=a+c;
		x.push(zhi);
	}
	if(b=='-')
	{
		zhi=a-c;
		x.push(zhi); 
	}
	if(b=='*')
	{
		zhi=a*c;
		x.push(zhi);
	}
	if(b=='/')
	{
		zhi=a/c;
		x.push(zhi);
	}
} 
 
//在+-*/中 只会有 * / 和 - +的比较 
//先搞一个字符数组  z[]预定义一下 当差值 >=2 时为不同等级 
char z[]={'(',')','!','+','-','!','*','/','\0'};
 //运算符栈的比较 当前元素 m 和栈顶 n 比较 
int bij(char m,char n)
{
	int i=0,j=0;
	while(m!=z[i])
	{
		i++;
	} 
	while(n!=z[j])
	{
		j++;
	}
	return i-j;
 } 
 //一个递归解决 () 里有好几个运算
void kuohao()
{
	if(y.top()=='(')  //这是防止太坑 比如 3+(1)-2 这种 
		y.pop();
	else
	{
		sys();
		if(y.top() =='(') 
			y.pop();
		else
			kuohao();
	}
	
 } 
int main()
{
	string s;
	cin >>s;
	int i;
	for(i=0;i<s.size();) // 对于运算式的扫描 
	{   //这里的i 的移动是在每一步操作里的 方便操作
		if(s[i]-'0'>=0&&s[i]-'0'<=9) 
		{  //数字的存储
			int res=0; 
			while(s[i]-'0'>=0&&s[i]-'0'<=9)
			{
				int z=s[i]-'0';
				res=res*10 + z;
				i++;
			}
			x.push(res); 
				
		}
		else
		{   //运算符和()之间分别判断 之后还可以有其他运算如 平方等
			if(s[i]=='/'||s[i]=='*'||s[i]=='+'||s[i]=='-')
			{
				//在进入运算符栈的时候应该先判断优先级
				if(y.empty()) y.push(s[i]),i++;
				else
				{
					if(bij(s[i],y.top())>=2)//优先级高的进栈 
					{
						y.push(s[i]);
						i++;
					}
					else
					{
						//cout<<bij(s[i],y.top());
						sys();
						y.push(s[i]);
						i++;
					}
					//y.push(s[i]);
				}
			}
			if(s[i]=='(')  
					y.push(s[i]),i++;
			if(s[i]==')') //进行括号里的所有运算
				kuohao(),i++; 
		}	
	}
	//这是用于3+2*4 这种的 
	while(!y.empty())
		sys();
	cout <<x.top(); 
	return 0; 
 } 

这里的 测试样例还不够
如有问题请多多指点;

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值