Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:怎么会出现内存引用错误呢??

Posted by hbhztianwei at 2005-05-29 15:21:25
In Reply To:怎么会出现内存引用错误呢?? Posted by:hbhztianwei at 2005-05-29 15:19:35
> #include <iostream>
> 
> using namespace std;
> 
> //定义一些常量
> const int OK=1;
> const int ERROR=0;
> const int TRUE=1;
> const int FALSE=0;
> const int STACKINCREMENT=10;
> const int STACKSIZE=100;
> 
> 
> template <class T>
> class SqStack
> {
>   public:
> 	  T * top;
> 	  T * base;
> 	  int stacksize;
> };
> 
> 
> 
> //定义操作
> template <class T>
> class Operators{
> 	public:
> 	
> 	  	//1建立一个空栈
> 	int InitStack(SqStack <T>&S);
> 	
> 
> 	//2销毁一个栈
> 	int DestoryStack(SqStack <T>&S)
> 	{
> 	  delete [] S;
> 	  return OK;
> 	}
> 	//3清空一个栈
> 	int ClearStack (SqStack <T>&S)
> 	{
> 	 if (S.top==S.base)
> 		  return TRUE;
> 	 else
> 		 S.top=S.base;
> 	     return OK;
> 	}
> 	//4返回栈中元素的个数,即栈的长度
> 	int StackLength(SqStack <T>&S)
> 	{
> 	  return S.top-S.base;
> 	}
> 	//5返回栈顶元素
> 	int GetTop(SqStack <T>&S,T &e)
> 	{
> 	  if(S.top==S.base)
> 		  return ERROR;
> 	  e=*(S.top-1);
> 	  return OK;
> 	}
> 	//6向栈中压入一个元素
> 	int Push (SqStack <T> &S, T e);
> 	
> 	//7向外弹出一个元素
> 	int Pop(SqStack <T>&S,T &e)
> 	{
> 	  if(S.top==S.base)
> 		  return ERROR;
> 	  e=*--S.top;
> 	  return OK;
> 	}
> 	//8判断一个栈是否为空
> 	int StackEmpty(SqStack <T>&S)
> 	{
> 	  if (S.top==S.base)
> 		  return TRUE;
> 	  return FALSE;
> 	}
> 
> };
> template <class T>
> int Operators<T>::InitStack(SqStack <T>&S)
> 	{
> 	  S.base=new T [STACKSIZE];
> 	  if (!S.base) exit (ERROR);
> 	  S.base=S.top;
> 	  S.stacksize=STACKSIZE;
> 	  return OK;
> 	}
> template <class T>
> int Operators<T>:: Push (SqStack <T> &S, T e)
> 	{
> 	  
> 	  if ((S.top-S.base)>=S.stacksize)
> 	  {
> 	    S.base=new T [S.stacksize+STACKINCREMENT];
> 		if (!S.base)
> 		exit(ERROR);
> 		S.top=S.base+S.stacksize;
> 	  }
> 
> 		*S.top=e;
> 		S.top++;
> 		return OK;
> 	}
> //返回运算符优先级
> int isp(char e);
> 
> //判断是不是运算符
> int IsSign(char e);
> 
> //计算
> int operate (int a,char x,int b);
> 
> 
> //比较优先级
> char precede(char a,char b);
> 
> //字符串转化成数据
> long int convert(char str[]);
> 	
> //计算表达式的值
> long int EvaluateExpression(char c[]);
> 
> 
>  int main ()
>   {
> 	  char a [20]={"100+(1*2)="};
>       cout<<"结果是:"<<EvaluateExpression(a)<<endl;
> 	  return 1;
>   }
> 
> 
> 
> long int convert(char str[])
> 	{
> 	  int j=1;
> 	  int c=0;
> 	  for(int i=0;i<10;i++)
> 	  {
> 	    if ('0'<=str[i]&&str[i]<='9')
> 		{
> 		  str[i]=j*(str[i]-'0');
> 		  c+=str[i];
> 		}
> 		j*=10;
> 	  }
> 	  return c;
> 	}
> int isp(char e)
> {
>   int priority;
>   switch (e)
>   {
>   case '(':
>   case '#':
>   case '=':
> 	  priority=0;
> 	  break;
>   case'+':
>   case '-':
>       priority=1;
> 	  break;
>   case'*':
>   case '/':
> 	  priority=2;
> 	  break;
>   case')':
> 	  priority=10;
> 	  break;
> 
>   }
>   return priority;
> } 
> //判断是不是运算符
> int IsSign(char e)
> {
>   switch(e)
>   {
>   case '(':
>   case '+':
>   case '-':
>   case '*':
>   case '/':
>   case ')':
>   case '=':
>       return TRUE;
> 	  break;
>   }
>   return FALSE;
> }
> //计算
> int operate (int a,char x,int b)
> {
>  switch (x)
>  {
>  case '+':
> 	 return a+b;
> 	 break;
>  case '-':
> 	 return a-b;
> 	 break;
>  case '*':
> 	 return a*b;
> 	 break;
>  case '/':
> 	 return a/b;
> 	 break;
>  }
>  return ERROR;
> }
> 
> //比较优先级
> char precede(char a,char b)
> {
>   int aa=isp(a);
>   int bb=isp(b);
>   if(a==b)
> 	  return '=';
>   else if(a>b)
> 	  return '>';
>   else
> 	  return '<';
> }
> 
> 
> long int EvaluateExpression(char c[])
> {
>   
>   Operators <char> OPTR;
>   Operators <long int> OPND;
>   SqStack<char> optr;
>   SqStack <long int>opnd;
>   OPTR.InitStack(optr);
>   OPTR.Push(optr,'#');
>   OPND.InitStack(opnd);
>   char f;
>   OPTR.GetTop(optr,f);
>   char str[10];
>   int i=0;
>   while (*c!='='||f!='#')
>   {
>    
>     if(!IsSign(*c))
> 	{
> 	    str[i]=*c;
> 		if(!IsSign(*(c+1)))
> 		{
> 			i++;
> 			c++;
> 		    continue;
> 		}
> 		OPND.Push(opnd,convert(str));
> 		i=0;
> 	  
> 	}
> 	else
> 	{
> 		char e;
> 	    OPTR.GetTop(optr,e);
> 		switch (precede(e,*c))
> 		
> 		{
> 		    case'<':
> 				OPTR.Push(optr,*c);
> 				c++;
> 				break;
> 			case '=' :
> 				char x;
> 				OPTR.Pop(optr, x);
> 				c++;
> 				break;
> 			case '>':
> 				char y;
> 				OPTR.Pop(optr,y);
> 				long int a,b;
> 				OPND.Pop(opnd,a);
> 				OPND.Pop(opnd,b);
> 				OPND.Push(opnd,operate(a,y,b));
> 				break;
> 		}
>         OPTR.GetTop(optr,e);
> 	}
>      
>   }
>  long int value;
>  OPND.Pop(opnd,value);
>  return value ;
> }
> 
>   

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator