| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:怎么会出现内存引用错误呢??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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator