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

这段代码对一些读入的非法数据判断存在错误
比如像出现 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";
}


 

posted @ 2014-12-11 12:42  __夜风  阅读(275)  评论(0编辑  收藏  举报