#include<iostream>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
using namespace std;
typedef struct
{
int *base;
int *top;
int stacksize ;
} SqStack_OPND;
typedef struct
{
char *base;
char *top;
int stacksize ;
} SqStack_OPTR;
bool InitStack_OPND(SqStack_OPND &s)
{
s.base = (int*) malloc(STACK_INIT_SIZE * sizeof(int) ) ;
if(!s.base) return false;
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return true;
}
bool InitStack_OPTR(SqStack_OPTR &s)
{
s.base = (char*) malloc(STACK_INIT_SIZE * sizeof(char) ) ;
if(!s.base) return false;
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return true;
}
char GetTop_OPTR(SqStack_OPTR &s )
{
char e;
if(s.top == s.base) return 0;
e = *(s.top-1);
return e;
}
char GetTop_OPND(SqStack_OPND &s )
{
int e;
if(s.top == s.base) return 0;
e = *(s.top-1);
return e;
}
bool Push_OPTR(SqStack_OPTR &s , char e)
{
if(s.top - s.base > s.stacksize) {
s.base = (char*) realloc(s.base , (s.stacksize + STACKINCREMENT) * sizeof(char) );
if(!s.base) return false;
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREMENT;
}
*s.top++ = e;
return true;
}
bool Push_OPND(SqStack_OPND &s , int e)
{
if(s.top - s.base > s.stacksize) {
s.base = (int*) realloc(s.base , (s.stacksize + STACKINCREMENT) * sizeof(int) );
if(!s.base) return false;
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREMENT;
}
*s.top++ = e;
return true;
}
bool Pop_OPTR(SqStack_OPTR &s , char &e)
{
if(s.top == s.base) return false;
e = * --s.top;
return true;
}
bool Pop_OPND(SqStack_OPND &s , int &e)
{
if(s.top == s.base) return false;
e = * --s.top;
return true;
}
SqStack_OPTR OPTR ;
SqStack_OPND OPND ;
int e;
char Precede(char e , char c)
{
int convert_e , convert_c;
switch(e)
{
case '+' : convert_e = 1 ; break;
case '-' : convert_e = 2 ; break;
case '*' : convert_e = 3 ; break;
case '/' : convert_e = 4 ; break;
case '(' : convert_e = 5 ; break;
case ')' : convert_e = 6 ; break;
case '#' : convert_e = 7 ; break;
}
switch(c)
{
case '+' : convert_c = 1 ; break;
case '-' : convert_c = 2 ; break;
case '*' : convert_c = 3 ; break;
case '/' : convert_c = 4 ; break;
case '(' : convert_c = 5 ; break;
case ')' : convert_c = 6 ; break;
case '#' : convert_c = 7 ; break;
}
if(convert_e == 1 && convert_c == 1) return '>';
if(convert_e == 1 && convert_c == 2) return '>';
if(convert_e == 1 && convert_c == 3) return '<';
if(convert_e == 1 && convert_c == 4) return '<';
if(convert_e == 1 && convert_c == 5) return '<';
if(convert_e == 1 && convert_c == 6) return '>';
if(convert_e == 1 && convert_c == 7) return '>';
if(convert_e == 2 && convert_c == 1) return '>';
if(convert_e == 2 && convert_c == 2) return '>';
if(convert_e == 2 && convert_c == 3) return '<';
if(convert_e == 2 && convert_c == 4) return '<';
if(convert_e == 2 && convert_c == 5) return '<';
if(convert_e == 2 && convert_c == 6) return '>';
if(convert_e == 2 && convert_c == 7) return '>';
if(convert_e == 3 && convert_c == 1) return '>';
if(convert_e == 3 && convert_c == 2) return '>';
if(convert_e == 3 && convert_c == 3) return '>';
if(convert_e == 3 && convert_c == 4) return '>';
if(convert_e == 3 && convert_c == 5) return '<';
if(convert_e == 3 && convert_c == 6) return '>';
if(convert_e == 3 && convert_c == 7) return '>';
if(convert_e == 4 && convert_c == 1) return '>';
if(convert_e == 4 && convert_c == 2) return '>';
if(convert_e == 4 && convert_c == 3) return '>';
if(convert_e == 4 && convert_c == 4) return '>';
if(convert_e == 4 && convert_c == 5) return '<';
if(convert_e == 4 && convert_c == 6) return '>';
if(convert_e == 4 && convert_c == 7) return '>';
if(convert_e == 5 && convert_c == 1) return '<';
if(convert_e == 5 && convert_c == 2) return '<';
if(convert_e == 5 && convert_c == 3) return '<';
if(convert_e == 5 && convert_c == 4) return '<';
if(convert_e == 5 && convert_c == 5) return '<';
if(convert_e == 5 && convert_c == 6) return '=';
if(convert_e == 5 && convert_c == 7) return '0';
if(convert_e == 6 && convert_c == 1) return '>';
if(convert_e == 6 && convert_c == 2) return '>';
if(convert_e == 6 && convert_c == 3) return '>';
if(convert_e == 6 && convert_c == 4) return '>';
if(convert_e == 6 && convert_c == 5) return '0';
if(convert_e == 6 && convert_c == 6) return '>';
if(convert_e == 6 && convert_c == 7) return '>';
if(convert_e == 7 && convert_c == 1) return '<';
if(convert_e == 7 && convert_c == 2) return '<';
if(convert_e == 7 && convert_c == 3) return '<';
if(convert_e == 7 && convert_c == 4) return '<';
if(convert_e == 7 && convert_c == 5) return '<';
if(convert_e == 7 && convert_c == 6) return '0';
if(convert_e == 7 && convert_c == 7) return '=';
}
char theta;
int Operate(int a , char theta , int b)
{
switch(theta)
{
case '+' : return a+b;
case '-' : return a-b;
case '*' : return a*b;
case '/' : return a/b;
}
}
bool In(char c)
{
switch(c)
{
case '+' :
case '-' :
case '*' :
case '/' :
case '(' :
case ')' :
case '#' : return true;
}
return false;
}
int EvaluateExpression()
{
char c;
InitStack_OPTR(OPTR); Push_OPTR(OPTR , '#');
InitStack_OPND(OPND); c = getchar();
while( c != '#' || GetTop_OPTR(OPTR) != '#')
{
if(!In(c))
{
Push_OPND(OPND , c-48); c =getchar();
}
else
{
switch( Precede(GetTop_OPTR(OPTR) , c) )
{
case '<':
{
Push_OPTR(OPTR , c) ; c = getchar(); break;
}
case '=':
{
char x;
Pop_OPTR(OPTR , x) ; c = getchar(); break;
}
case '>':
{
int a ,b;
Pop_OPTR(OPTR , theta);
Pop_OPND(OPND , b); Pop_OPND(OPND ,a);
Push_OPND(OPND , Operate(a ,theta ,b));
break;
}
}
}
}
return GetTop_OPND(OPND);
}
int main()
{
cout<<"输入表达式,得出运算结果,输入以#结束,输入完毕请按回车!"<<endl;
int result = EvaluateExpression();
cout<<"表达式结果为:"<<endl;
cout<<result<<endl;
return 0;
}