学过数据结构之后一直想把里面使用栈完成的表达式运算给完成,直达今天在调试两个显示之后才将其成功运行,真是有点悲催,还是自己算法功力不够啊,看别人都写的老简单了。。。
把自己的代码贴出来供以后参考吧
typedef struct Node{
int* data;
int len;
int pop;
int size;
}Stack;
char pri[7][7] = {{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=',' '},{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}};
int caculate_sab(int a,int b,char op){
int res;
if(op == '+'){
res = a+b;
}
else if(op == '-'){
res = a-b;
}
else if(op == '*'){
res = a*b;
}
else if(op == '/'){
res = a/b;
}
return res;
}
char precede(char a,char b){
return pri[a][b];
}
int trans(char c){
int res;
switch(c){
case '+':
res = 0;
break;
case '-':
res = 1;
break;
case '*':
res = 2;
break;
case '/':
res = 3;
break;
case '(':
res = 4;
break;
case ')':
res = 5;
break;
case '#':
res = 6;
break;
default:
res = -1;
break;
}
return res;
}
int initStack(Stack* s,int len){
s->size = len;
s->data = (int*)malloc(sizeof(int)*len);
s->pop = -1;
return 1;
}
int isEmpty(Stack* s){
if(s->pop == -1){
return 1;
}
else{
return 0;
}
}
int pop(Stack* s,int *e){
if(s->pop== -1){
return 0;
}
else{
*e = s->data[s->pop];
s->pop--;
s->len--;
}
return 1;
}
int push(Stack* s,int e){
if(s->pop>=s->size-1){
return 0;
}
s->pop++;
s->data[s->pop] = e;
s->len++;
return 1;
}
int getTop(Stack s){
if(s.pop == -1){
return 0;
}
return s.data[s.pop];
}
计算函数 s 是传入的表达式 如 "3+2*2"
int calculate(char* s) {
Stack st,sp;
int len = strlen(s);
initStack(&st,len);
initStack(&sp,len);
push(&sp,'#');
char c = s[0];
int i=1;
int e;
int sa,sb,res;
int op;
while(c!='#'|| getTop(sp)!='#'){
if(c == ' '){
if(i<len){
c = s[i++];
}
else{
c = '#';
}
}
else if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='('&&c!=')'&&c!='#'){
int temp = c-'0';
for(;i<len;i++){
if(s[i]>=48 && s[i]<=57){
temp = temp*10+s[i]-'0';
}
else{
break;
}
}
push(&st,temp);
if(i<len){
c = s[i++];
}
else{
c = '#';
}
}
else{
int a = trans(getTop(sp));
int b = trans(c);
char prior = precede(a,b);
if(prior == '<'){
push(&sp,c);
if(i<len){
c = s[i++];
}
else{
c = '#';
}
}
else if(prior == '='){
pop(&sp,&e);
if(i<len){
c = s[i++];
}
else{
c = '#';
}
}
else if(prior == '>'){
pop(&st,&sb);
pop(&st,&sa);
pop(&sp,&op);
res = caculate_sab(sa,sb,op);
push(&st,res);
}
}
}
return getTop(st);
}