我的大学之数据结构NO.3

本文介绍了一种基于算符优先关系的算术表达式求值算法,通过使用运算符栈和运算数栈,实现了从终端输入的整数表达式的求值。详细展示了算法流程,包括优先级定义、运算执行及主函数处理。

表达式求值
一、需求分析
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例3-1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。

二、部分代码
1.定义优先级

char Precede(char t1, char t2)   
{  
	char opt[8][8]={ ">><<<>>",//53页表3.1优先级
            		 ">><<<>>", 
					 ">>>><>>", 
				     ">>>><>>",
					 "<<<<<=@",
       	             ">>>>@>>",
                     "<<<<<@="};
            int i, j ;
            switch(t1) 
			{
               case '+': i=0; break;
               case '-': i=1; break;
               case '*': i=2; break;
			   case '/': i=3; break;
			   case '(': i=4; break;
			   case ')': i=5; break;
			   case '#': i=6; break;
			 }
           switch(t2) {
               case '+': j=0; break;
               case '-': j=1; break;
               case '*': j=2; break;
			   case '/': j=3; break;
			   case '(': j=4; break;
			   case ')': j=5; break;
			   case '#': j=6; break;
			                }
			 return opt[i][j];
       }

2.返回操作数a和b在二元运算符op下的运算结果

 int Operate( int a, char op, int b) 
{  
	int result;
    switch(op)
	{
		case '+': result = a+b;  break;
        case '-': result = a-b;  break;
        case '*': result = a*b;  break;
        case '/': result = a/b;  break;           
     }
     return result;
}

3.主函数

int main()
{
	int change, temp, k;
	stack<int>OPTR;
	stack<char>OPND;
	OPND.push('#');
	string str;
	cout <<"请输入表达式:" << endl; 
	getline(cin,str);
	str[str.size()]='#';
	int i= 0;
	while (i<=str.size())
	{
		if(str[i]>='0'&&str[i]<='9')
		{
			int j=1;//记录共有几个数字
			int iTemp=i;//记录此时i的值 
			while(str[i+1]>='0'&&str[i+1]<='9')
			{				
				j++;
				i++;
			}
		temp =0;
		change =0;
		int jTemp = j-1; 
		for( k=0; k<j; k++)
		{
			change=str[iTemp+k]-'0'; 
			temp+=change*pow(10,jTemp--);//将字符串转化为数字 
		}
		OPTR.push(temp);
		i++;	
		}
		else{
			switch (Precede(OPND.top(),str[i]))
			{
				case '<':OPND.push(str[i]);i++;break;
				case '>':  
				{
					int right = OPTR.top();OPTR.pop(); 
					int left = OPTR.top();OPTR.pop();
					if(right==0&&OPND.top()=='/')
					{
						cout << "error(分母不能为0)";
						return 0;
					}
					else
					{
						OPTR.push(Operate(left,OPND.top(),right));
						OPND.pop();
					}
						break;
				}
			case '=':OPND.pop();i++;break; //脱括号 
			case '@':cout<< "error"; return 0;	
			}
		}	
}	 
	cout << "表达式的值="; 
	cout <<OPTR.top()<< endl;
	return 0;
}

本程序借鉴资料与相关代码,不住之处希望指出。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值