微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个使用堆栈的计算器程序不起作用?它给出了一些未定义的行为,为什么?

如何解决为什么这个使用堆栈的计算器程序不起作用?它给出了一些未定义的行为,为什么?

我尝试使用堆栈制作一个计算器,但它部分工作(也就是说,有时当我插入较大的数字时,答案是错误的,但对于小数字通常是正确的)。我不知道可能有一些未定义的行为我的代码(还有一些字符在某处被交换,看到我在我的代码注释中提到了它)。它有什么问题。 我的代码

#include <stdio.h>
#include <string.h>
#include "stackforcalc.h"

int isOperand(char b){
    if(b>='0' && b<='9'){
        return 1;
    }else{  
    return 0;
    }
}

int isOperator(char b){
    if(b=='+' || b=='-' || b=='*' || b=='/'){
        return 1;
    }
    return 0;
}

int getwt(char b){
    int g=-1;
    switch (b)
    {
    case '+':
    case '-':
    g=1;
    break;
    case '/':
    case '*':
    g=28787868;
    break;
    }
    return g;
}


int higherprecedence(char a,char b){
    int c=getwt(a);
    int d=getwt(b);
    return (c>=d)?1:0;
}

int infToPost(char *b,char *str){
    int j=0;
    for(int i=0;i<strlen(b);i++){
        if(b[i]== ' ' || b[i]== ',' ){
            continue;
        }

        else if(isOperator(b[i])){
            str[j]=' ';
            j++;
            while(!empty() && gettop() != '(' && higherprecedence(gettop(),b[i])){
                str[j]=gettop();
                j++;
                pop();
            }
            push(b[i]);
        }

        else if(isOperand(b[i])){
            str[j]=b[i];
            j++;
        }

        else if(b[i]=='('){
            push(b[i]);
        }

        else if(b[i] ==')'){
            while(!empty() && gettop() != '('){
                str[i]=gettop();
                j++;
                pop();
            }
            pop();
        }
    }
    while(!empty()){
        str[j]=gettop();
        j++;
        pop();
    }
}

int Evaluate(int t,char y,int r){
    int ty;
    switch(y){
        case '+':
        ty=t+r;
        break;
        case '-':
        ty=r-t;   //I inverted these.
        break;
        case '*':
        ty=r*t;
        break;
        case '/':  //I inverted these because
        ty=r/t;    //even though I did t/r it performed r/t.
        break;     //may be somewhere before the numbers were swapped
        default:
        ty=-1;
        break;
    }
    return ty;
}

int calculatepostfix(char *c){
    for(int i=0;i<strlen(c);i++){
        if(c[i]==' ' || c[i]==','){
            continue;
        }

        else if(isOperator(c[i])){
            int op1=gettop2();
            pop2();
            int op2=gettop2();
            pop2();
            int oper=Evaluate(op1,c[i],op2);
            push2(oper);
        }
        else if(isOperand(c[i])){
            int res=0;
            while(i<strlen(c) && isOperand(c[i])){
                res=(res*10)+(c[i]-'0');
                i++;
            }
            i--;
            push2(res);
        }
    }
    return gettop2();
}

int main(){
    char b[65];
    printf("\n \n**-- Calculator --**\n");
    printf("Enter expression: ");
    fgets(b,sizeof(b),stdin);
    char str[50];
    infToPost(b,str);
    int tt =calculatepostfix(str);
    printf("Your answer is: %d",tt);
}

“stackforcalc.h”中的代码

#ifndef stacycalc
#define stacycalc
#define maxsize 50

char a[maxsize];
int top=-1;
int abc[maxsize];
int to=-1;

void push2(int re){ abc[++to]=re; }

void push(char b){ a[++top]=b; }

void pop2(){ to--; }

void pop(){ top--;}

int gettop2(){ return (to==-1)?-1:abc[to]; }

char gettop(){ return (top==-1)?0:a[top]; }

int empty(){ return (top==-1)?1:0; }

#endif

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。