#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