fxy123 发表于 2021-12-15 10:24:29

兄弟们为什么 输入 3*(5+8)-7 或者 4+(3+4)没结果 怎么解决 急求

#include<stdio.h>
#define ERROR 0
#define OK 1

//定义顺序栈
typedef struct{
        char stack;      // 定义存储空间为100
        int top;//栈顶指针           起始值为0新增一个数栈顶 均加1
}SqStack;

//顺序栈初始化
void InitStack(SqStack *S){
                S->top=0;//把栈顶指针位置为0
}
//进栈操作
int PushStack(SqStack *S,char e){
        if(S->top >= 100)                        //进栈前 ,判断是否栈已经满了最大为100
        {
                printf("栈已满,进栈失败\n");
                return ERROR;
        }else{
                S->stack=e;
                S->top++;
                return OK;
        }
}

//出栈操作
int PopStack(SqStack *S,char *e){
        if(S->top==0)
        {
                printf("栈已经没有元素,不能出栈");// 出栈时,栈空
                return ERROR;
        }else{
                S->top--;
                *e=S->stack;
                return OK;
        }
}

//取栈顶元素
int GetTop(SqStack S,char *e)
{
        if(S.top<=0)
        {
                printf("栈已经空\n");//栈空
                return ERROR;
        }else{
                *e=S.stack;
                return OK;
        }
}


int StackEmpty(SqStack S)      //判断栈是否为空
{
        if(S.top==0){
                return OK;
        } else{
                return ERROR;
        }
}




//中缀表达式转换成后缀表达式
void PostExpress(char str[],char exp[]){
        SqStack S;      //数字      符号
        InitStack(&S);
        char ch;
        char e;//取栈顶元素比较
        int i=0,j=0;
        ch=str;    //获取输入的数或符号
        i++;//用于获得下一个
        while(ch!='\0')//不为空 NULL
        {
                        //case进栈均是 算术符号    数字直接出栈
                switch(ch)
                {
                        case '(':
                                PushStack(&S,ch);//进栈操作
                                break;
                        case ')' :            
                                while(GetTop(S,&e)&&e!='(')//取栈顶元素,当栈顶不为 左括号时 接着向下取
                                {
                                        PopStack(&S,&e);//弹出
                                        exp=e;//将出栈元素非左括号 放到数组exp[]中
                                        j++;
                                }
                                PopStack(&S,&e);//当遇到(时,将符号插入栈中;当遇到)时,将(取出栈   但不用保存在数组中
                                break;
                        case '+':
                        case '-':
                                while(!StackEmpty(S)&& GetTop(S,&e)&&(e!='('))// S不为空取S中的栈顶元素且栈顶元素不为(   
                                {                                           // 因为出现(时,说明应当先对()内进行运算
                                        PopStack(&S,&e);// 弹出栈顶元素   加减优先级低, 同时如果出现相同优先级的符号时,应当是先进去的先出来
                                                         //运算符的优先级小于栈顶运算符的优先级时,将栈顶运算符弹出并输出   没遇到左括号就先算
                                        exp=e;//栈顶元素 放到exp[]            
                                        j++;
                                }
                                PushStack(&S,ch);//将当前运算符进栈
                                break;
                        case '*':
                        case '/':
                                while(!StackEmpty(S)&& GetTop(S,&e)&&(!e=='(')) //乘除优先级 小于左括号   还是有问题 当 x*(y-z) 相遇没结果
                                {                                                                                                                // 出栈    y z - x *
                                        PopStack(&S,&e);// 弹出栈顶元素   
                                        exp=e;
                                        j++;
                                }
                                PushStack(&S,ch);//将当前运算符进栈
                                break;
                       
                        default:
                                while(ch>='0'&&ch<='9')   // 获得数字考虑 输入的数字不止一位
                                {
                                        exp=ch;//b
                                        j++;
                                        ch=str;//a
                                        i++;
                                }
                                i--;
                                exp=' ';
                                j++;
                }
                ch=str;
                i++;
        }
        while(!StackEmpty(S))//扫描到中缀表达式的末尾[即扫描结束],若堆栈中还有存留的运算符依次弹出并输出即可。
        {
                PopStack(&S,&e);
                exp=e;
                j++;
        }       

}












typedef struct {
        float data;
        int top;
}OpStack;


//计算后缀表达式
float ComputeExpress(char a[]){
        OpStack S;
        int i=0,value;
        float x1,x2;
        float result;//作为返回值
        S.top= -1;
        while(a!='\0')
        {
                if(a!=' ' && a>='0'&& a<='9')//数字部分
                {
                        value=0;
                        while(a!=' ')//数字链接在一起 ,为一个整体
                        {
                                value=10*value+a -'0';   //????
                                i++;
                        }
                        S.top++;
                        S.data=value;
                }else
                {
                        switch(a)// 符号部分 加减乘除
                        {
                                case '+':
                                        x1=S.data;
                                        S.top--;
                                        x2=S.data;
                                        S.top--;
                                        result=x1+x2;
                                        S.top++;
                                        S.data=result;//将   result 作为数组的元素
                                        break;
                                case '-':
                                        x1=S.data;
                                        S.top--;
                                        x2=S.data;
                                        S.top--;
                                        result=x2-x1;
                                        S.top++;
                                        S.data=result;
                                        break;
                                case '*':
                                        x1=S.data;
                                        S.top--;
                                        x2=S.data;
                                        S.top--;
                                        result=x1*x2;
                                        S.top++;
                                        S.data=result;
                                        break;
                                case '/':
                                        x1=S.data;
                                        S.top--;
                                        x2=S.data;
                                        S.top--;
                                        result=x2/x1;   //需要 float 型   int型 小于1的部分会截去
                                        S.top++;
                                        S.data=result;
                                        break;
                        }//switch
                        i++;
                }
       }
       if(S.top!=-1){
               result=S.data;
               S.top--;
               if(S.top==-1)
                       return result;
               else
               {
                       printf("表达式错误");
                        return ERROR;
                }
       }
}


int main() {
        char a,b;
        float f;
        printf("请输入一个算术表达式:\n");
        gets(a);//读取字符串
        printf("中缀表达式:%s \n" ,a);
        PostExpress(a,b);
        printf("后缀表达式 %s \n" ,b);
        f=ComputeExpress(b);
        printf("计算结果: %.2lf \n",f);
        return OK;
}

阿萨德按时 发表于 2021-12-15 16:16:37

混点鱼币
{:10_254:}

1molHF 发表于 2021-12-15 18:39:42

混点鱼币

心驰神往 发表于 2021-12-16 08:05:29

顶一下

sunyt 发表于 2021-12-16 09:21:36

{:10_254:}

小bai学c 发表于 2021-12-16 09:40:35

代码有点长啊,可以混鱼币{:5_108:}

小师姨 发表于 2021-12-17 02:47:41

抱歉,不太懂
页: [1]
查看完整版本: 兄弟们为什么 输入 3*(5+8)-7 或者 4+(3+4)没结果 怎么解决 急求