#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define error 0
#define ok 1
#define overflow -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define MAXSIZE 100
#define OPSETSIZE 8
char OPSET[OPSETSIZE]={'+','-','*','/','%','(',')','#'};//可以取余数
unsigned char Prior[8][8] = { // 算符间的优先关系
'>','>','<','<','<','<','>','>',
'>','>','<','<','<','<','>','>',
'>','>','>','>','>','<','>','>',
'>','>','>','>','>','<','>','>',
'>','>','>','>','>','<','>','>',
'<','<','<','<','<','<','=','0',
'>','>','>','>','>','0','>','>',
'<','<','<','<','<','<','0','='
};
struct expression
{
double result;
char expstr[MAXSIZE];
}exp;
typedef int Status;
template <typename T>
struct SqStack
{
T *top;//栈顶指针
T *base;//在栈构造之前和之后,base的值为NULL
int stacksize;//当前已分配的储存空间,以元素为单位
};//顺序栈结构模板
template <typename T1,typename T2>
Status InitStack(T1 &S)
{//构造一个空栈T1 T2为指向T1的指针
S.base=(T2 *)malloc(STACK_INIT_SIZE*sizeof(T2));//分配空间
if(!S.base) exit (overflow);//分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return ok;
}//初始化栈函数模板
template <typename T1,typename T2>
Status Push(T1 &S,T2 e)
{//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize)
{//栈满,追加储存空间
S.base=(T2 *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2));//分配空间
if(!S.base) exit (overflow);//分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return ok;
}//入栈函数模板
template <typename T1,typename T2>
Status Pop(T1 &S,T2 &e)
{//若栈不空则删除S的栈顶元素,用e返回其值,并返回OK,否则返回error
if(S.top==S.base) return error;