Zijeak 2018-11-27 14:57 采纳率: 33.3%
浏览 1123
已采纳

【数据结构】用栈实现的带括号的多位数四则运算器

题目原型: 四则运算器:实现多位整数的带括号的四则运算

现存问题:

1.以下代码利用两个char类型的栈分别存取运算数和运算符,但在结束一次优先级高运算后(考虑到运算精度问题,故在程序中,将每次运算的结果都保存为double型)可能会出现浮点值,这个值必须要压栈,并于下一个优先级产生运算,但这个浮点型值无法压入char型栈中,必须要一位一位存取才可实现,请问有没有比较好的办法解决这个问题,应该怎样将数据压入栈中?

2.程序中出现如图所示错误,麻烦大佬指点一下原因!图片说明

 #include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define Stack_Size 50

typedef char StackElementType; 
typedef struct
{
    StackElementType elem[Stack_Size];
    int Top;
}SeqStack; 

void InitStack(SeqStack *S);
int Push(SeqStack *S,StackElementType x);
int Pop(SeqStack *S,StackElementType *x);
int GetTop(SeqStack *S,StackElementType *x);
StackElementType Compare(StackElementType ch1,StackElementType ch2);
StackElementType Execute(StackElementType a,StackElementType op,StackElementType b);

int main()
{
    printf("%c",ExpEvaluation()); 
    return(0);
}
StackElementType ExpEvaluation()
{
    SeqStack OPTR,OVS;
    StackElementType n;
    StackElementType a,b,ch,op,x,v;
    InitStack(&OPTR);
    InitStack(&OVS);
    Push(&OPTR,'#');
    printf("Please input an expression(Ending with #):");
    ch=getchar();//为方便,所以数字也以字符形式来存储 
    while(ch!='#'||GetTop(&OPTR,&x)!='#')
    {
        if(ch>='0'&&ch<='9')//不是操作符,是操作数,进OVS栈 
        {
            int temp;
            temp=ch-'0';//先把当前操作数从字符变为数字 
            ch=getchar();
            while(ch>='0'&&ch<='9')//继续判断下一位是否为操作数
            {
                temp=temp*10+ch-'0';
                ch=getchar();
            } 
            Push(&OVS,temp);

        }
        else
        switch(Compare(ch,GetTop(&OPTR,&x)))
        {
            case '>':Push(&OPTR,ch);
              scanf("%d",&ch);
            case '=':Pop(&OPTR,&op);ch=getchar();break;//脱括号 
            case '<':Pop(&OPTR,&op);//形成运算 
            Pop(&OVS,&b);
            Pop(&OVS,&a);
            v=Execute(a,op,b);
            //此处需要将v转换为字符型并且入站 
            Push(&OVS,v);
            break; 
        }
    }
    v=GetTop(&OVS,&x);
    return(v);
} 

//初始化
void InitStack(SeqStack *S)
{
    /*构造一个空栈S*/
    S->top=-1; 
} 
//进栈
int Push(SeqStack *S,StackElementType x)
{
    if(S->top==Stack_Size-1)
     return(FALSE);
    S->top++;
    S->elem[S->top]=x;
    return(TRUE);
} 
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
    if(S->top==-1)
     return(FALSE);
    *x=S->elem[S->top];
    S->top--;
    return(TRUE);
} 
//读栈顶
int GetTop(SeqStack *S,StackElementType *x)
{
    if(S->top==-1)
     return(FALSE);
    else
    {
        *x=S->elem[S->top];
        return(TRUE);
    }
} 


//比较优先级,返回'>','<','=' 
StackElementType Compare(StackElementType ch1,StackElementType ch2)
//ch1为还未进栈的运算符,ch2为当前运算符栈顶元素 
{
    //'('未入栈时,优先级最高,入栈后,优先级最低 
    switch(ch1)
    {
        case '(':ch1=6;break;
        case '*':
        case '/':ch1=5;break;
        case '+':
        case '-':ch1=4;break;
        case ')':ch1=3;break;
    }
    switch(ch2)
    {
        case '*':
        case '/':ch2=5;break;
        case '+':
        case '-':ch2=4;break;
        case ')':ch2=3;break;
        case '(':ch2=2;break;
    }
    if(ch1>ch2)
     return('>');
     else if(ch1=ch2)
      return('=');
      else
       return('<');
}
StackElementType Execute(StackElementType a,StackElementType op,StackElementType b)
{
    double v;
    switch(op)
    {
        case '+':v=(double)a+(double)b;break;
        case '-':v=(double)a-(double)b;break;
        case '*':v=(double)a*(double)b;break;
        case '/':v=(double)a/(double)b;break;
    }
    return((StackElementType)v);
}

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-11-27 17:34
    关注

    C语言是大小写敏感的语言
    typedef struct
    {
    StackElementType elem[Stack_Size];
    int Top;
    }SeqStack;
    你注意看,Top是大写的

    S->top++;
    你这里是小写的。

    错误提示都是这个类型的错误

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)