栈计算表达式怎么算输都是10

求(ಥ_ಥ)这哪错了怎么输都得到10是怎么回事
#include
#include
#include
#include
using namespace std;
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 100//存储空间分配增量
typedef double SElemType;
typedef int Status;
typedef struct
{
SElemType* base;
SElemType* top;
int stacksize;//当前已分配的存储空间
}SqStack;
Status InitStack(SqStack& OPTR)
{
OPTR.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!OPTR.base)exit(OVERFLOW);//存储分配失败
OPTR.top = OPTR.base;
OPTR.stacksize = STACK_INIT_SIZE;
return 1;
}
Status Push1(SqStack& S, SElemType e)//插入元素e为新的栈顶元素
{
if (S.top - S.base >= S.stacksize)//栈满追加空间
{
SElemType *temp= (SElemType )realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if (temp != NULL)
{
S.base = temp;
}
if (!S.base)exit(OVERFLOW);//存储空间分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
S.top++ = e;
return 1;
}
Status Push2(SqStack& S, char e)//插入元素e为新的栈顶元素
{
if (S.top - S.base >= S.stacksize)//栈满追加空间
{
SElemType
tmp = (SElemType
)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if (tmp != NULL)
{
S.base = tmp;
}//防止空指针
if (!S.base)exit(OVERFLOW);//存储空间分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return 1;
}
Status Pop1(SqStack& S, SElemType& e)
{
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则0
if (S.top == S.base)return 0;
e = *--S.top;
return 1;
}
Status Pop2(SqStack& S, char & e)//判断运算符
{
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则0
if (S.top == S.base)return 0;
e = *--S.top;
return 1;
}
Status gettop1(SqStack &S, SElemType& e)
{
//若栈不空则用e返回栈顶元素,并返回1否则0
if (S.top == S.base) return 0;
e = *(S.top - 1);
return e;
}
char gettop2(SqStack &S, char & e)
{
//若栈不空则用e返回栈顶元素,并返回1否则0
if (S.top == S.base) return 0;
e = *(S.top - 1);
return e;
}

char precede(char s, char t)//判断两个操作符的优先级表,来判断优先级关系
{
switch (s)
{
case '+' :
switch (t)
{
case '+':
case '-':
case ')':
case '#':
return '>';
default:
return '<';
}
case '-':
switch (t)
{
case '+':
case '-':
case ')':
case '#':
return '>';
default:
return '<';
}
case '*':
switch (t)
{
case '(':
return '<';
default:
return '>';
}
case '/':
switch (t)
{
case '(':
return '<';
default:
return '>';
}
case '%':
switch (t)
{
case '(':
return '<';
default:
return '>';
}
case '(':
switch (t)
{
case ')':
return '=';//只是弹出)不弹出(
default:
return '<';//希望继续压入数字
}
case ')':
return '>';//右括号不入栈
case '#':
return '<';//开始结束符

default:
    break;
}

}

double operate(double s, double m, char t)//两个数和一个运算符进行运算
{
switch (t)
{
case '+':
return s+m;
case '-':
return s-m;
case '':
return s
m;
case '/':
return m/s;
case '%':
return ((int)m) % ((int)s);//整数相余
default:
return 0;
}
}

bool isdigit(char s)//判断是否为数字
{
if (s - '0' >= 0 && s - '0' <= 9)
return true;
return false;
}
Status In(char c)

{ // 判断c是否为运算符

switch (c)

{

case'+':return 1;
case'-':return 1;
case'*':return 1; 
case'/':return 1;
case'%':return 1;

    

default:return 0;

}

}

int main()
{
SqStack OPTR; SqStack OPND; char c;//OPTR是运算符OPND是操作数
InitStack(OPTR); InitStack(OPND); double e; char theta; double a, b;
Push2(OPTR, '#');
c = getchar();
while (c != '#' || gettop2(OPTR, theta) != '#')
{
if (!In(c))
{
Push1(OPND, c);//不是运算符
c = getchar();
}
else
switch (precede(gettop2(OPTR,theta),c))
{
case '<':
Push2(OPTR, theta); c = getchar(); break;
case '='://脱括号
Pop2(OPTR, theta); c = getchar(); break;
case '>'://退栈
Pop2(OPTR, theta); Pop1(OPND, b); Pop1(OPND, a);
Push1(OPND, operate(a, theta, b)); break;

        default:
            break;
        }
}

cout << gettop1(OPND, e);
return e;

}