1+2/3*(4-6)*6/8+9*2 = ?
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 32 typedef struct{ int data[MAXSIZE];//数据段 int top;//栈指针 }sqstack; sqstack *sqstack_create() { sqstack *sq; sq = malloc(sizeof(*sq)); if(sq == NULL ) { return NULL; } sq->top = -1; return sq; } int sqstack_push(sqstack *sq, int *data)//入栈 { if(sq->top == MAXSIZE-1)//full { return -1; } else { sq->data[++sq->top] = *data; } return 0; } int sqstack_top(sqstack *sq, int *data)//取得栈顶数据 { if(sq->top == -1)//empty { return -1; } *data = sq->data[sq->top]; return 0; } int sqstack_pop(sqstack *sq, int *data)//出栈 { if(sq->top == -1)//empty { return -1; } *data = sq->data[sq->top--]; return 0; } int compute(sqstack *snum, int ope) { int n1, n2, n; sqstack_pop(snum, &n1); sqstack_pop(snum, &n2); switch(ope) { case '+': n=n1+n2; printf("%d+%d=%d\n", n1, n2, n); break; case '-': n=n2-n1; printf("%d-%d=%d\n", n2, n1, n);break; case '*': n=n1*n2; printf("%d*%d=%d\n", n1, n2, n);break; case '/': n=n2/n1; printf("%d/%d=%d\n", n2, n1, n);break; default: return -1;//break; } sqstack_push(snum, &n);//将运算结果压入数字栈 return 0; } void deal_bracket(sqstack *snum, sqstack *sope)//处理括号 { int old_ope; sqstack_top(sope, &old_ope);//取得栈顶运算符 while(old_ope != '(') { sqstack_pop(sope, &old_ope); compute(snum, old_ope); sqstack_top(sope, &old_ope);//取得栈顶运算符 } sqstack_pop(sope, &old_ope); } int sqstack_is_empty(sqstack *sq) { return (sq->top == -1); } int get_pri(int ope) { switch(ope) { case '(': return 0; case '+': case '-': return 1; case '*': case '/': return 2; } } void deal_ope(sqstack *snum, sqstack *sope, int ope)//处理运算符 { int old_ope; if(ope == '('||sqstack_is_empty(sope)) { sqstack_push(sope, &ope); return ; } sqstack_top(sope, &old_ope); if(get_pri(ope) > get_pri(old_ope)) { sqstack_push(sope, &ope); return ; } while(get_pri(ope) <= get_pri(old_ope))// * + { sqstack_pop(sope,&old_ope); compute(snum,old_ope); if(sqstack_is_empty(sope)) break; sqstack_top(sope,&old_ope); } sqstack_push(sope,&ope); } int main() { sqstack *snum;//运算数字栈 sqstack *sope;//运算符栈 int i = 0, value = 0, flag = 0, old_ope; char str[] = "1+3-(2*5)*(8-6)+5";//所要计算的表达式 //初始化 snum = sqstack_create(); sope = sqstack_create(); while(str[i] != '\0') { if(str[i] >= '0' && str[i] <= '9')//数字 { value = value*10 + str[i]-'0'; flag = 1; } else//运算符 { if(flag == 1)//取得了运算的数字 { sqstack_push(snum, &value);//数字入 运算数字栈 value = 0; flag = 0; } if(str[i] == ')') { deal_bracket(snum,sope); } else//(+-*/ { deal_ope(snum,sope,str[i]); } } i++; } if(flag) { sqstack_push(snum,&value); } while(!sqstack_is_empty(sope)) { sqstack_pop(sope, &old_ope); compute(snum, old_ope); } sqstack_pop(snum, &value); printf("%s = %d\n", str, value); return 0; }