#include "stdafx.h" #include "stdio.h" #include "stdlib.h" #define N 20 static char priority_array[7][7]={ {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','>'}, {'>','>','>','>','>','>','>'}, {'<','<','<','<','<','>','='} }; int operator_get_id(char oper){ switch(oper){ case'+': return 0; case'-': return 1; case'*': return 2; case'/': return 3; case'(': return 4; case')': return 5; case'#': return 6; default: return -1; } } char compare_priority(char oper,char oper1){ int id=operator_get_id(oper); int id1=operator_get_id(oper1); if( id!=-1 && id1!=-1 ) return priority_array[id][id1]; else { printf("运算符受限!"); return NULL; } } int get_result(int a,char opt,int b ){ switch(opt){ case'+': return a+b; case'-': return a-b; case'*': return a*b; case'/': return a/b; default: printf("超出运算权限!!"); break; } } int is_oper(char input){ //判断是否为操作符,此处有一小bug return (input==43||input==45||input==42||input==47||input==35||input==40||input==41); } void reset_temp(char * temp){ for(int i=0;i<10;i++) temp[i]='/0'; } int get_expression_result(){ char oper_stack[N]; //此处利用数组模拟的栈 oper_stack[0]='#'; int oper_top=1; long int data_stack[N]; int data_top=0; char temp[10]; reset_temp(temp); int cur=0; int tag=1; //该tag变量用于进行判断while循环前是否读入了新的ch,如要是为了防止case'>'没有读入ch的情况 char ch=getchar(); // 由于使用getchar所以先输入10以内的数字 while(oper_stack[oper_top-1]!='#'||ch!='#'){ if(!is_oper(ch)){ //判断是否为操作符 //data_stack[data_top++]=(int)ch-48; temp[cur++]=ch; ch=getchar(); tag=1; //一旦读入了新的ch则tag置1; } else{ if(tag){ data_stack[data_top++]=atol(temp); reset_temp(temp); cur=0; tag=0; } switch( compare_priority(oper_stack[oper_top-1],ch) ){ //此处千万注意compare_priority函数的两个参数不可互换位置 //因为上面的优先级矩阵不是对称矩阵 case'<': //ch的优先级大的时候,将其入栈 oper_stack[oper_top++]=ch; ch=getchar(); tag=1; break; case'=': //此处为#,和括号的情况,退栈,即退光"#"和"(",")" --oper_top; ch=getchar(); tag=1; break; case'>': //此处为ch的优先级小于符号栈顶,此时则先不进栈,先将符号栈退栈,计算结果后再进栈 char temp1=oper_stack[--oper_top]; int result=get_result(data_stack[--data_top],temp1,data_stack[--data_top]); data_stack[data_top++]=result; break; } } } return data_stack[data_top-1]; //返回最后的数据栈栈底元素 } void main(int argc, char* argv[]) { printf("%d/n",get_expression_result()); }