鱼C论坛

 找回密码
 立即注册
查看: 814|回复: 6

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

[复制链接]
发表于 2021-12-15 10:24:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

//定义顺序栈
typedef struct{
        char stack[100];      // 定义存储空间为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[S->top]=e;
                S->top++;
                return OK;
        }
}

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

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

}












typedef struct {
        float data[50];
        int top;
}OpStack;


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


int main() {
        char a[50],b[50];
        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;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-15 16:16:37 | 显示全部楼层

回帖奖励 +20 鱼币

混点鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-15 18:39:42 | 显示全部楼层

回帖奖励 +20 鱼币

混点鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-16 08:05:29 | 显示全部楼层

回帖奖励 +20 鱼币

顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-16 09:21:36 | 显示全部楼层

回帖奖励 +20 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-16 09:40:35 | 显示全部楼层

回帖奖励 +20 鱼币

代码有点长啊,可以混鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-17 02:47:41 From FishC Mobile | 显示全部楼层
抱歉,不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-15 01:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表