表达式--栈的实现(数据结构)

这段代码对一些读入的非法数据判断存在错误
比如像出现 a++b 就无法判断了
另外需要注意的是我觉得栈里面存储的是char型的,但是在操作数值的时候,会很不方便
还有一点在主函数里面如果想用while来多次读入数据的话,那么你要考虑上一次输入数据失败后,那后面的字符该怎么操作
上面出现的问题大家可以尝试着去解决
以下是根据书上的代码简单敲出来的

 

bool In(char c)
 { 
   if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
	   return true;
   return false;
 }

char Precede(char t1,char t2)
{ 
	char f = '>';
	if(t2 == '+'||t2 == '-')
	{
		if(t1 == '('||t1 == '#')  f = '<';
	//	if(t1 == '+'||t1 == '-'||t1 == '*'||t1 == '/')  
		//这种情况是后面测试数据中如果出现两个x++y时补上的,可是发现如果是x+y+z形式也符合,so这个问题还没解决
	//	{
	//		FLAG = 0;return 'k';
	//	}
	}
	if(t2 == '*'||t2 == '/')
	{
		if(t1 == '+'||t1 =='-'||t1 == '('||t1 == '#')
			f = '<';
	}
	if(t2 == '(')
		if(t1 ==')')
		{
			FLAG=0;return 'k';
		}
		else
			f = '<';
	if(t2 == ')')
	{
		   if(t1 == '(') f = '=';
		   if(t1 == '#') {FLAG=0;return 'K';}
	}
	if(t2 == '#')
	{
		if(t1 == '(')   {FLAG=0;return 'K';}
		if(t1 == '#')   f = '=';
	}
    return f;
}

char Operate(char a,char c,char b)
{
//这里稍微调试了一下,主要是码值int和char之间的转换
	a = a-48;   
	b = b-48;
	//cout<<((char)a+b);
	//cout<<a<<" "<<b<<endl;
	if(c == '+') return (char)(a+b+48);
	if(c == '-') return (char)(a-b+48);
	if(c == '*') return (char)(a*b+48);
	if(c == '/') return (char)(a/b+48);
}
void shixian()
{
	char ch,k,a,b,h; //ch是读入数据,k是运算符,ab是数值,h无实际作用
	//int a,b,h;
	Stack OPTR,OPND;
	Init_stack(OPTR);Push(OPTR,'#');

	Init_stack(OPND);cin>>ch;
	while(ch!='#'||Gettop(OPTR)!='#')
	{
		
		if(FLAG==0) {printf("Wrong!");break;}
		//提前结束
		if(!In(ch))
		{
			Push(OPND,ch);
			cin>>ch;
			//Out_stack(OPND);
			//Out_stack(OPTR);
		}
		else
		{
			switch(Precede(Gettop(OPTR),ch))
			{
			case'>':
				Pop(OPTR,k);
				Pop(OPND,a); Pop(OPND,b);
				Push(OPND,Operate(b,k,a));
				//Out_stack(OPND);
				//cout<<ch;
				//cout<<b-48<<" "<<a-48<<endl;
				break;
			case'<':
				Push(OPTR,ch);
				cin>>ch;
				break;
			case'=':
				Pop(OPTR,h);
				cin>>ch;
				break;
			default:break;
			}
		}
	}
	if(FLAG == 1)
	    cout<<Gettop(OPND)-48<<endl;
	else
		cout<<"读入数据有错!\n";
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值