数据结构代码

源代码在线查看: algo3-7.cpp

软件大小: 767 K
上传用户: Sundaymorn
关键词: 数据结构 代码
下载地址: 免注册下载 普通下载 VIP

相关代码

				 // algo3-7.cpp 表达式求值(范围为int类型,输入负数要用(0-正数)表示)
				 typedef int SElemType; // 栈元素类型为整型,改进算法3.4
				 #include"c1.h"
				 #include"c3-1.h"
				 #include"bo3-1.cpp"
				
				 SElemType Precede(SElemType t1,SElemType t2) // 同algo3-6.cpp
				 { // 根据教科书表3.1,判断两符号的优先关系
				   SElemType f;
				   switch(t2)
				   {
				     case '+':
				     case '-':if(t1=='('||t1=='=')
				                f='				              else
				                f='>';
				              break;
				     case '*':
				     case '/':if(t1=='*'||t1=='/'||t1==')')
				                f='>';
				              else
				                f='				              break;
				     case '(':if(t1==')')
				              {
				                printf("ERROR1\n");
				                exit(ERROR);
				              }
				              else
				                f='				              break;
				     case ')':switch(t1)
				              {
				                case '(':f='=';
				                         break;
				                case '=':printf("ERROR2\n");
				                         exit(ERROR);
				                default: f='>';
				              }
				              break;
				     case '=':switch(t1)
				              {
				                case '=':f='=';
				                         break;
				                case '(':printf("ERROR2\n");
				                         exit(ERROR);
				                default: f='>';
				              }
				   }
				   return f;
				 }
				
				 Status In(SElemType c) // 几乎与algo3-6.cpp相同
				 { // 判断c是否为运算符
				   switch(c)
				   {
				     case'+':
				     case'-':
				     case'*':
				     case'/':
				     case'(':
				     case')':
				     case'=':return TRUE; // 此句不同于algo3-6.cpp
				     default:return FALSE;
				   }
				 }
				
				 SElemType Operate(SElemType a,SElemType theta,SElemType b) // 有改动
				 {
				   SElemType c;
				   switch(theta)
				   {
				     case'+':c=a+b;
				             break;
				     case'-':c=a-b;
				             break;
				     case'*':c=a*b;
				             break;
				     case'/':c=a/b;
				   }
				   return c;
				 }
				
				 SElemType EvaluateExpression() // 有改动
				 { // 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈
				   SqStack OPTR,OPND;
				   SElemType a,b,d,x,theta;
				   char c; // 存放由键盘接收的字符串
				   char z[6]; // 存放整数字符串
				   int i;
				   InitStack(OPTR); // 初始化运算符栈
				   Push(OPTR,'='); // =是表达式结束标志
				   InitStack(OPND); // 初始化运算数栈
				   c=getchar();
				   GetTop(OPTR,x);
				   while(c!='='||x!='=')
				   {
				     if(In(c)) // 是7种运算符之一
				       switch(Precede(x,c))
				       {
				         case'				                 c=getchar();
				                 break;
				         case'=':Pop(OPTR,x); // 脱括号并接收下一字符
				                 c=getchar();
				                 break;
				         case'>':Pop(OPTR,theta); // 退栈并将运算结果入栈
				                 Pop(OPND,b);
				                 Pop(OPND,a);
				                 Push(OPND,Operate(a,theta,b));
				       }
				     else if(c>='0'&&c				     {
				       i=0;
				       do
				       {
				         z[i]=c;
				         i++;
				         c=getchar();
				       }while(c>='0'&&c				       z[i]=0;
				       d=atoi(z); // 将字符串数组转为整型存于d
				       Push(OPND,d);
				     }
				     else // c是非法字符
				     {
				       printf("ERROR3\n");
				       exit(ERROR);
				     }
				     GetTop(OPTR,x);
				   }
				   GetTop(OPND,x);
				   return x;
				 }
				
				 void main() // 有改动
				 {
				   printf("请输入算术表达式,负数要用(0-正数)表示,并以=结束\n");
				   printf("%d\n",EvaluateExpression());
				 }
							

相关资源