First-chance exception in biaodashiqiuzhi.exe: 0xC0000005: Access Violation.
#include<iostream>
#include "c.h"
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
template<typename T>class SqStack
{
public:
T *base;
T *top;
T e;
int size;
public:
void InitStack(SqStack)//声明栈建立函数
{
base=(T *)malloc(STACK_INIT_SIZE *sizeof(T));
if(!base)cout<<"存储分配失败!";//存储分配失败
top=base;
size=STACK_INIT_SIZE;
}
void Push(T e)//入栈
{
if((top - base)>=size)//栈满,追加存储空间
{
base=(T *)realloc(base,(size+STACKINCREMENT)*sizeof(T));
if(!base)cout<<"存储分配失败!";
else
{
top=base+size;
size=size+STACKINCREMENT;
}
}
*top=e;
top = top+1;//将元素e入栈,指针上移
}
T GetTop()//取栈顶元素
{
T e;
if(top==base)cout<<"\n运算符栈已空!\n";
else e=*(top-1);
return e;
}
T Pop()//出栈
{
T e;
if(top==base)cout<<"\n运算符栈已空!\n";
e=*(--top);
return e;
}
/* void DispStack()//从栈底到栈顶依次输出各元素
{
T e,*p;
if(top==base)cout<<" ";
else
{
p=base;
while(p<top)
{
e=*p;
p++;
cout<<e;
}
}
}*/
};
template<typename T>class Evaluate
{
private:
char c,m,n;
float a,b;
bool Operator(char c); //判断c是否为7中运算符之一
float Operate(float a,char c,float b); //运算函数
char Compare(char m,char n); //运算符的优先级比较
public:
void Expression();
};
bool Evaluate<void>::Operator(char c) //判断c是否为7中运算符之一
{
switch (c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#': return true;
default: return false;
}
}
float Evaluate<void>::Operate(float a,char c,float b) //运算函数
{
float sum=0;
if (c=='+') sum=a+b; //从运算符栈取出的符号为"+",则运算数栈的两元素相加,并返回
else if(c=='-') sum=a-b; //从运算符栈取出的符号为"-",则运算数栈的两元素相减,并返回
else if(c=='*') sum=a*b; //从运算符栈取出的符号为"*",则运算数栈的两元素相乘,并返回
else if(c=='/') //从运算符栈取出的符号为"/",则运算数栈的两元素相除,并返回
{
if(b==0) cout<<"\n表达式出错!除数不能为0!\n";
else sum=a/b;
}
return sum;
}
char Evaluate<void>::Compare(char m,char n) //运算符的优先级比较
{
if(n=='+'||n=='-') //输入符号为"+"、"-"
{
if(m=='('||m=='#')return '<'; //栈顶元素为"("、"#",此时栈顶符号优先级低,返回"<"
else return '>'; //否则,栈顶符号优先级高,返回">"
}
else if(n=='*'||n=='/') //输入的符号为"*"、"/"
{
if(m==')'||m=='*'||m=='/')return '>'; //栈顶元素为")"、"*"、"/",此时栈顶符号优先级高,返回">"
else return '<'; //否则,栈顶符号优先级低,返回"<"
}
else if(n=='(')return'<'; //输入的符号为"(",则直接返回"<"
else if(n==')') //输入的符号为")"
{
if(m=='(')return'='; //栈顶元素为"(",此时优先级同,返回"="
else return '>'; //否则,栈顶符号优先级高,返回">"
}
else //输入符号为其他
{
if(m=='#')return'='; //栈顶元素为"#",此时优先级同,返回"="
else return '>'; //否则,栈顶符号优先级高,返回">"
}
}
void Evaluate<void>::Expression()
{
SqStack<char> OPTR;
SqStack<float> OPND;
char c;
float t,e,p1,p2;
int n=0,i=1,j=0,l=0;
char w[STACK_INIT_SIZE];
cout<<"请输入算术表达式,负数用(0-正数)表示,以'#'结束:\n "<<endl;
cin>>w;
c=w[0];
// w=w +'#';
int s=1;
char ch1;
OPTR.Push('#');//将'#'入栈,作为低级运算符
c=w[0];
while(c!='#'||OPTR.GetTop()!='#')
{
qq:
if(!Operator(c))//输入的字符如果不是运算符号,则继续输入直到输入的是运算符为止,将非运算符转换成浮点数
{
if(!(c=='.')&&n>=0)
{
e=float(c-48);
n++;
if(n==1)t=e;
else if(n>1)t=t*10+e;
c=w[s++];
}
if(n==-1)
{
e=float(c-48);
t=t+e/10;
c=w[s++];
}
if(c=='.')
{
n=-1;
c=w[s++];
}
if((c>='0'&&c<='9')||c=='.')
{
goto qq;
}
if(c<'0'||c>'9')
{
OPND.Push(t);
}
}
else//输入的是运算符
{
n=0;//非运算型数据计数器清零
switch(Compare(OPTR.GetTop(),c))//比较运算符优先级
{
case '<'://栈顶元素优先级低,则入栈且继续输入
OPTR.Push(c);
c=w[s++];
break;
case '='://栈顶元素优先级相等,脱括号并接收下一字符
OPTR.Pop();
c=w[s++];
break;
case '>'://栈顶元素优先级高,则退栈并将运算结果入栈
p1=OPND.Pop();
p2=OPND.Pop();
ch1=OPTR.Pop();
OPND.Push(Operate(p2,ch1,p1));
break;
}
}
}
if(OPND.top-1==OPND.base)//显示表达式的最终结果
cout<<"\n表达式的结果为:"<<OPND.GetTop()<<endl;
else cout<<"\n表达式有误!\n";
}
void main()
{
// char w[STACK_INIT_SIZE];
Evaluate<void> E;
E.Expression();
// cout<<"请输入算术表达式,负数用(0-正数)表示:"<<endl;
// cin>>w;
// cout<<"表达式结果等于" E.Expression(w);
}
此程序在运行时出现“First-chance exception in biaodashiqiuzhi.exe: 0xC0000005: Access Violation.”
请问是什么问题?该如何解决?