算术表达式求值写的代码找不出问题,求解!!!

#include<bits/stdc++.h>
#define TRUE 1
#define FALSE 0
#define chartonumber(x) (x-'0')
#define OPSETSIZE 7
#define STACK_INIT_SIZE 1000
using namespace std;

typedef struct   //运算符栈       
{
	char *base;
	char *top1;
	int stacksize;
}S1;
typedef struct  //运算数栈       
{
	int *base;
	int *top2;
	int stacksize;
}S2; 

void InitS1(S1 &S)//构造S1空栈
{
     S. base=(char*)malloc(STACK_INIT_SIZE * sizeof(S1));
     if(!S.base)exit(OVERFLOW);
     S.top1=S.base;
     S.stacksize=STACK_INIT_SIZE;
}
void InitS2(S2 &S)//构造S2空栈 
{
     S.base=(int*)malloc(STACK_INIT_SIZE * sizeof(S2));
     if(!S.base) exit(OVERFLOW);
     S.top2=S.base;
     S.stacksize=STACK_INIT_SIZE;
 }

char GetTopS1(S1 S)//返回S1的栈顶元素
{return *(S.top1-1);}
int GetTopS2(S2 S)//返回S2的栈顶元素
{return *(S.top2-1);}

void PushS1(S1 &S,char e)//s1入栈 
{ *S.top1++=e;}
void PushS2(S2 &S,int e)//s2入栈 
{ *S.top2++=e;}
void PopS1(S1 &S,char &e)//s1出栈 
{ e=*--S.top1;}   
void PopS2(S2 &S,int &e)//s2出栈 
{ e=*--S.top2;} 

char stackEmpty(S1 &S)//判别s2是否为空栈 
{
	if(S.top1==S.base)
	return TRUE;
	else return FALSE;
}

int Operate(int a,unsigned char optr, int b)//运算符计算 
 {
   switch(optr)
    {
      case '+': return a+b;
      case '-': return a-b;
      case '*': return a*b;
      case '/': return a/b;
      default : return 0;
   } 
}	
char Precede(char c1,char c2) //判断运算符优先级 
{ 
   int i,j,u=0,v=0;
   char OPSET[OPSETSIZE]={'#','+','-','*','/','(',')'};
   static int array[7][7]={{0,-1,-1,-1,-1,-1,-1,}, 
                            {1,1,1,-1,-1,-1,1,},
                            {1,1,1,1,1,-1,1,},
                            {1,1,1,1,1,-1,1,},
                            {1,-1,-1,-1,-1,-1,0,},
                            {1,1,1,1,1,1,1 }};
   for(i=0;i<7;i++)
   { if(c1==OPSET[i])
       u= i;
   }
    for(j=0;j<7;i++)
   { if(c2==OPSET[j])
       v= j;
   }
   return array[v][u];
}

int  main()
{
	S1 s1;S2 s2;
	InitS1(s1);InitS2(s2);
	stringstream str;
	char ch,a;
    int ch1,x,y;
	cin>>ch;
	while(stackEmpty(s1)==FALSE)
	{   if(isdigit(ch)) //ch中是数字字符:将ch转化成数字,存入操作数栈s2中
		{str>>ch;
		str<<ch1;
		PushS2(s2,ch1);
		}
		else 
		{	
			switch(Precede(GetTopS1(s1),ch))
			{
			  
			  case -1:PushS1(s1,ch);break;
			  case 1:
			  	PopS1(s1,a);
			  	GetTopS2(s2);PopS2(s2,x);
			    GetTopS2(s2);PopS2(s2,y);
			  	PushS2(s2,Operate(x, ch, y));
			  	break;
			  case 0:PopS1(s1,a);break;
		    } 
		}
	}	
	if(stackEmpty(s1)==TRUE)
	{cout<<GetTopS2(s2);}
	return 0;
}

不知道为什么结果会这样

e=*--S.top1;

这里是栈顶指针先减1再取值吧,是不是应该先取值再减1

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632