写了大半夜终于写完了
整理算法如下:
——遇运算对象,直接压入OPND
——遇运算符op,与OPTR 栈顶op'比较。op' 优先级不低于op 时弹出op ',从OPDN 弹出运算对象,计算结果压入OPDN。反复至栈顶运算符优先级低于op 时将运算符op 压入OPTR
——遇左括号,直接进栈OPTR
——遇右括号,逐个弹出运算符,从OPDN 弹出运算对象,计算并将结果压入OPDN,直至把对应左括号弹出
——遇表达式结束,逐个弹出运算符并进行计算,直至处理完全部运算符
——若OPDN 只有一个元素则完成并输出,否则表达式有错。
代码
只支持+-*/()操作
- #include<iostream>
- #include<stdlib.h>
- using namespace std;
- #define OK 1
- #define ERROR 0
- #define MAXSIZE 50
- typedef int Status;
- typedef struct
- {
- double array[MAXSIZE];
- int top;
- }Stack_OPND;
- typedef struct
- {
- char array[MAXSIZE];
- int top;
- }Stack_OPTR;
- Status InitStack(Stack_OPND &opnd,Stack_OPTR &optr)
- {
- opnd.top=0;
- optr.array[0]='#';
- optr.top=1;
- return OK;}
- Status Push_OPND(double a,Stack_OPND &opnd)
- {
- if(opnd.top>MAXSIZE) exit(1);
- opnd.array[opnd.top++]=a;
- return OK;}
- Status Push_OPTR(char a,Stack_OPTR &optr)
- {
- if(optr.top>MAXSIZE) exit(1);
- optr.array[optr.top++]=a;
- return OK;}
- double Pop_OPND(Stack_OPND &opnd)
- {
- return opnd.array[--opnd.top];}
- char Pop_OPTR(Stack_OPTR &optr)
- {
- return optr.array[--optr.top];}
- char Gettop_OPTR(Stack_OPTR optr)
- {
- return optr.array[--optr.top];}
- char Precede(char a,char b)
- {
- switch(a)
- {
- case '+':case '-':
- if(b=='+'||b=='-')
- return '=';
- else if(b=='*'||b=='/')
- return '<';
- case '*':case '/':
- if(b=='+'||b=='-')
- return '>';
- else if(b=='*'||b=='/')
- return '=';
- case '(': return '<';
- case '#': return '<';
- default:
- exit(1);}
- }
- void Caculate(Stack_OPND &opnd,char op)
- {
- double a,b;
- a=Pop_OPND(opnd);
- b=Pop_OPND(opnd);
- switch(op)
- {
- case '+': Push_OPND(a+b,opnd); break;
- case '-': Push_OPND(a-b,opnd); break;
- case '*': Push_OPND(a*b,opnd); break;
- case '/': Push_OPND(a/b,opnd); }
- }
- double EvaluateExpression(char* MyExpression)
- {
- Stack_OPTR OPTR;
- Stack_OPND OPND;
- char *p=MyExpression;
- char t[10];
- int i;
- double d;
- char op;
- InitStack(OPND,OPTR);
- while(*p!='/0')
- if(*p>='0'&&*p<='9')
- {
- i=0;
- t[i]=*p++;
- while(i<9&&*p>='0'&&*p<='9'||*p=='.')
- t[++i]=*p++;
- t[i+1]='/0';
- if(i>9) exit(1);
- d=atof(t);
- Push_OPND(d,OPND);}
- else if(*p=='+'||*p=='-'||*p=='/'||*p=='*')
- { switch(Precede(Gettop_OPTR(OPTR),*p))
- {
- case '=': case '>':
- op=Pop_OPTR(OPTR);
- Caculate(OPND,op);
- Push_OPTR(*p,OPTR);p++;break;
- case '<':
- Push_OPTR(*p,OPTR);p++;break;
- }}
- else if(*p=='(')
- {
- Push_OPTR(*p,OPTR);
- p++; }
- else if(*p==')'){
- while((op=Pop_OPTR(OPTR))!='(')
- Caculate(OPND,op);
- p++;}
- else if(*p=='=')
- {
- while(OPTR.top!=1)
- {
- op=Pop_OPTR(OPTR);
- Caculate(OPND,op); }
- p++;}
- return OPND.array[0];
- }
- int main()
- {
- char MyExpression[100];
- while(cin>>MyExpression)
- cout<<"The answer is:"<<EvaluateExpression(MyExpression)<<endl;
- return 0;}
- 1+1=
- The answer is:2
- (3+4)*2=
- The answer is:14
- 4*(2+3*4)=
- The answer is:56