程序产生一个访问违例 这个程序到底哪儿出问题了?
#include<iostream>#include<math.h>
using namespace std;
typedef struct
{int e[20];
int top;}
SeqStack;
void InitStack(SeqStack *S);
void Push(SeqStack *S,int x);
void Pop(SeqStack *S,int *x);
int Gettop(SeqStack *S);
int Execute(int a,int op,int b);
void ExpEvaluation();
int Compare(int ch,int gettopS1);
SeqStack S1;
SeqStack S2;
int main()
{
ExpEvaluation();
system("pause");
return 0;
}
void ExpEvaluation()
{
InitStack(&S1);
InitStack(&S2);
Push(&S1,'#');
int op,a,b,d,ch,v;
printf("please input expression(ending with '#')");
ch=getchar();
while(ch!='#'||Gettop(&S1)!='#')
{
if(ch=='(') Push(&S1,ch);
else
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='#') // 如果是左括号或者操作符,则进栈S1;
switch(Compare(ch,Gettop(&S1)))
{
case '>':
Push(&S1,ch);
ch=getchar();
break;
case '<': Pop(&S1,&op);
Pop(&S2,&b);
Pop(&S2,&a);
v=Execute(a,op,b);
Push(&S2,v);
break;
}
else
if(ch>='0'&&ch<='9') //是操作数
{
int t=ch-'0';
ch=getchar();
while (ch>='0'&& ch<='9') //对多位整数的处理
{
t=t*10+(ch-'0');
ch=getchar();
}
Push(&S2,t);
}
else
if(ch==')')
{ while(Gettop(&S1)!='(')
{
Pop(&S1,&op);
Pop(&S2,&b);
Pop(&S2,&a);
v=Execute(a,op,b);
Push(&S2,v);
}
Pop(&S1,&op);
ch=getchar();
}
}//while 结束
printf("%d",v);
}//
void InitStack(SeqStack *S) //初始化
{
S->top=-1;
}
void Push(SeqStack *S,int x) //入栈
{
S->top++;
S->e[S->top]=x;
}
void Pop(SeqStack *S,int *x) //出栈
{
*x=S->e[S->top];
S->top--;
}
int Gettop(SeqStack *S) //取栈顶元素
{
int x;
x=S->e[S->top];
return (x);
}
int Execute(int a,int op,int b)
{
switch(op)
{
case'+': return a+b;
case'-': return a-b;
case'*': return a*b;
case'/': return a/b;
}
}
int Compare(int ch,int gettopS1)
{ if(ch=='#') return '<';
else
if(gettopS1=='( '||gettopS1=='#')return '>';
else
if (ch=='+'||ch=='-')
{
if(gettopS1=='*'||gettopS1=='/') return '<';
else return '>';
}
else
{
if(gettopS1=='+'||gettopS1=='-') return '>';
else return '<';
}
}
只有在进行有括号运算的时候才出错