//引用头文件
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef int ElemType;
const int STACK_INIT_SIZE=100; //存储空间的初始化分配量
const int STACKINCREMENT=10;//存储空间分配增量
typedef struct {ElemType *base; //存储空间基址
ElemType *top;//栈顶指针
int stacksize;//当前分配的存储空间}Stack;
//函数声明
int IfEmptyStack(Stack S);
void InitStack(Stack &S);
void EmptyStack(Stack &S);
void Push(Stack &S, ElemType e);
void Pop(Stack &S, ElemType &e);
void ShowStack(Stack S);
//声明定义变量
int In(char ch);
char Precede(char a, char b);
int Operate(int a, char f, int b);
int IfEmptyStack(Stack S){//判断是否为空栈
if(S.base==S.top) return 1; return 0;}
void InitStack(Stack &S){//构造一个空栈
S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
S.top=S.base; S.stacksize=STACK_INIT_SIZE; return;}
void EmptyStack(Stack &S){//若栈空则无返回值
S.top=S.base; return ;}
void Push(Stack &S, ElemType e){//插入元素e为新的栈顶元素(入栈)
if(S.top-S.base>=S.stacksize){
S.base=(ElemType *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(ElemType));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
} *S.top++=e; return ;}
void Pop(Stack &S, ElemType &e){//若栈不空则删除s的栈顶元素,用e返回其值,否则无返回值
if(S.top==S.base)return ; e=*--S.top; return ;}
ElemType GetTop(Stack &S){//若栈不空则返回s的栈顶元素,否则无返回值
if(S.top==S.base) return 0; return *(S.top-1);}
void ShowStack(Stack S){//输出
ElemType *p=S.base; while(p!=S.top)printf("%d",*p++); return;}
int In(char ch){ int res; switch(ch){
case '+': case '-': case '*': case '/': case '(': case ')':
case '=': res=1;break; default: res=0;break; case '@': exit(0);}
return res;}
char Precede(char a, char b){//判断符号的优先级
int i,j; int form[7][7]={
{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,2}, {1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};
switch(a){case '+':i=0;break; case '-':i=1;break;
case '*':i=2;break; case '/':i=3;break; case '(':i=4;break;
case ')':i=5;break; case '=':i=6;break;}switch(b){
case '+':j=0;break; case '-':j=1;break; case '*':j=2;break;
case '/':j=3;break; case '(':j=4;break; case ')':j=5;break;
case '=':j=6;break;//出栈时的结尾判断}//栈顶元素优先级
if(form[i][j]==1)return '>';
else if(form[i][j])return '<';
else return '=';}
int Operate(int a, char f, int b){ switch(f){
case '+': return a+b; case '-': return a-b;
case '*': return a*b; case '/': return a/b;}return 0;}
void EvaluateExpression(){//定义执行函数并实现相关操作
char c, d[100];
int i, f, num, tmpa, tmpb;
Stack OPTR, OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR, '='); c=getchar();
while(c!='='||GetTop(OPTR)!='='){
if(c>='0'&&c<='9'){ i=0;
do{d[i++]=c; c=getchar();
}while(c>='0'&&c<='9');
d[i]='/0'; num=atoi(d);
Push(OPND, num);}else if(In(c)){
switch(Precede(GetTop(OPTR), c)) {
case '<': Push(OPTR, (int)c);c=getchar(); break;
case '=': Pop(OPTR, f);c=getchar(); break;
case '>': Pop(OPTR, f);Pop(OPND, tmpb);Pop(OPND, tmpa);
Push(OPND, Operate(tmpa, f, tmpb)); break; }}}
c=getchar();//接收最后输入的一个回车符!!!否则在主函数中只能输入一次...
cout<<"所求表达式的值为:"; ShowStack(OPND); cout<<endl<<endl;}//主函数
int main(){
cout<<"输入@结束操作!";
cout<<"请输入表达式,以=结束求值:"<<endl;
while(1){EvaluateExpression();
cout<<endl;
cout<<"请再输入表达式,以=结束求值:"<<endl;}return 0;}