#include<iostream.h> typedef int Status; typedef char Cstack; #define OK 1 #define ERROR 0 typedef struct StackNode { Cstack data; struct StackNode *next; }StackNode,*LinkStack; Status InitStack(LinkStack &S) { S=NULL; return OK; } Status Push(LinkStack &S,Cstack e) { StackNode *p; p=new StackNode; p->data=e; p->next=S; S=p; return OK; } Status Pop(LinkStack &S,Cstack &e) { StackNode *p; if(S==NULL) return ERROR; e=S->data; p=S; S=S->next; delete p; return OK; } Cstack GetTop(LinkStack S) { if(S!=NULL) return S->data; } Status In(Cstack ch) { cin>>ch; if(ch=='+') return OK; else if(ch=='-') return OK; else if(ch=='*') return OK; else if(ch=='/') return OK; else if(ch=='#') return OK; else return ERROR; } Cstack Precede(Cstack t1,Cstack t2) { switch(t1) { case '+': switch(t2) { case '+':return '>';break; case '-':return '>';break; case '*':return '<';break; case '/':return '<';break; case '(':return '<';break; case ')':return '>';break; case '#':return '>';break; } break; case '-': switch(t2) { case '+':return '>';break; case '-':return '>';break; case '*':return '<';break; case '/':return '<';break; case '(':return '<';break; case ')':return '>';break; case '#':return '>';break; } break; case '*': switch(t2) { case '+':return '>';break; case '-':return '>';break; case '*':return '>';break; case '/':return '>';break; case '(':return '<';break; case ')':return '>';break; case '#':return '>';break; } break; case '/': switch(t2) { case '+':return '>';break; case '-':return '>';break; case '*':return '>';break; case '/':return '>';break; case '(':return '<';break; case ')':return '>';break; case '#':return '>';break; } break; case '(': switch(t2) { case '+':return '<';break; case '-':return '<';break; case '*':return '<';break; case '/':return '<';break; case '(':return '<';break; case ')':return '=';break; case '#':return '>';break; } break; case ')': switch(t2) { case '+':return '>';break; case '-':return '>';break; case '*':return '>';break; case '/':return '>';break; case '(':return '=';break; case ')':return '>';break; case '#':return '>';break; } break; case '#': return '='; break; } } Cstack Operator(Cstack t1,Cstack t2,Cstack t3) { t1=t1-48; t3=t3=48; int c; switch(t2) { case '+': c=t1+t2+48; return c; break; case '-': c=t1-t2+48; return c; break; case '*': c=t1*t2+48; return c; break; case '/': c=t1/t2+48; return c; break; } } void main() { LinkStack OPTR,OPAN; Cstack cha1,cha2,x,cha,thea; InitStack(OPTR); InitStack(OPAN); Push(OPTR,'#'); cout<<"输入表达式的中间值及最终结果局限于0~9之间的个位数并以#号结束"<<endl; while(cha!='#'||GetTop(OPTR)!='#') { cin>>cha; if(!In(cha)) Push(OPAN,cha); else switch(Precede(GetTop(OPTR),cha)) { case '<': Push(OPTR,cha); cin>>cha; break; case '>': Pop(OPTR,thea); Pop(OPAN,cha1); Pop(OPAN,cha2); Push(OPAN,(cha1,thea,cha2)); break; case '=': Pop(OPTR,x); break; } } cout<<GetTop(OPAN)<<endl; return; }