| ||||||||||
| 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 | |||||||||
怎么会出现内存引用错误呢??#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