struct stack_node { int data; struct stack_node *next; }; typedef struct stack_node stack_list; typedef stack_list *link;
link operator=NULL; link operand=NULL;
link push(link stack, int value) { link new_node; new_node=(link)malloc(sizeof(stack_list)); if(!new_node) { printf("Overflow!\n"); return NULL; } new_node->data=value; new_node->next=stack; stack=new_node; return stack; }
link pop(link stack, int *value) { link top; if(stack!=NULL) { top=stack; stack=stack->next; *value=top->data; free(top); return stack; } else *value=-1; }
int empty(link stack) { if(stack==NULL) return 1; else return 0; }
int isoperator(char op) { switch(op) { case '+': case '-': case '*': case '/': return 1; default: return 0; } }
int priority(char op) { switch(op) { case ')': return 3; case '*': case '/': return 2; case '+': case '-': return 1; case '(': return -1; default: return 0; } }
int get_value(int op, int operand1, int operand2) { switch((char)op) { case '*': return(operand2*operand1); case '/': return(operand2/operand1); case '-': return(operand2-operand1); case '+': return(operand2+operand1); } }
void main() { char exp[100]; int op=0; int operand1=0; int operand2=0; int result=0; int pos=0;
printf("Please input the expression:\n"); gets(exp);
while(exp[pos]!='\0'&&exp[pos]!='\n') { if(exp[pos]==' ') { pos++; continue; } if(exp[pos]=='(') operator=push(operator,exp[pos]); else if(exp[pos]==')') { operator=pop(operator,&op); while(op!='(') { operand=pop(operand,&operand1); operand=pop(operand,&operand2); operand=push(operand,get_value(op,operand1,operand2)); operator=pop(operator,&op); } } else if(isoperator(exp[pos])) { while(priority(exp[pos])<=priority(operator->data)&&!empty(operator)) { operator=pop(operator, &op); operand=pop(operand, &operand1); operand=pop(operand, &operand2); operand=push(operand,get_value(op,operand1,operand2)); } operator=push(operator,exp[pos]); } else operand=push(operand,exp[pos]-48); pos++; } while(!empty(operator)) { operator=pop(operator,&op); operand=pop(operand,&operand1); operand=pop(operand,&operand2); operand=push(operand,get_value(op,operand1,operand2)); } operand=pop(operand,&result); printf("The result of expression [%s] is: %d\n",exp,result); }