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

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

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