mogur 发表于 2021-11-13 23:05

求助大佬问题,谢谢:C语言,栈,有一块代码计算1+1,压进栈的时候我输出为什么是49

本帖最后由 mogur 于 2021-11-14 10:20 编辑

代码如下,代码我在别人中缀转后缀的代码上加了计算后缀的代码,不会调试我就在可能有数值改动的地方写个printf输出的数看看,

不知道为什么这个代码(188行)这个地方要减去48才可以算对
(不减去48的话在那几行增加个输出的代码的话,如果是1就会输出49)
Push_Stack(&s2,GetTop(&s1)-48);
                     Pop_Stack(&s1);
也没有大佬可以解答,谢谢。


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


//----------------------栈的实现--------------------------

typedef char ElemType;

#define STACKSIZE 50

typedef struct Stack   //定义栈的结构体
{
    ElemType*data;
    ElemTypetop;
    int stacksize;
}*StackPtr;

int Init_Stack(StackPtr stack)          //初始化
{
    if(stack == NULL)exit(0);
    stack->data = (ElemType*)malloc(sizeof(ElemType)*STACKSIZE);
    stack->stacksize = STACKSIZE;
    stack->top = 0;
    return true;
}

int Push_Stack(StackPtr stack,ElemType val)      //入栈
{
    if(stack == NULL)exit(0);
    stack->data = val;
    stack->top++;
    return true;
}

int Pop_Stack(StackPtr stack)          //出栈
{
    if(stack==NULL)exit(0);
    stack->top--;
    return true;
}

int GetTop(StackPtr stack)          //获取栈顶
{
    if(stack == NULL)exit(0);
    return stack->data;
}

int Empty_Stack(StackPtr stack)          //判空
{
    if(stack == NULL)exit(0);
    if(stack->top == 0)
    {
      return true;
    }
    else
    {
      return false;
    }
}

static int Apply_Stack(StackPtr stack)             //申请空间
{
    ElemType* p = (ElemType*)malloc(sizeof(ElemType)*stack->stacksize*2);
    if(p == NULL)return false;
    for(int i=0;i<stack->top;i++)
    {
      p = stack->data;
    }
    free(stack->data);
    stack->data = p;
    p = NULL;
    stack->stacksize*=2;
    return true;
}

static int Full_Stack(StackPtr stack)         //判满
{
    if(stack->stacksize == stack->top&&stack->top != 0)
    {
      Apply_Stack(stack);
      return true;
    }
    else
    {
      return false;
    }
}

int Clear_Stack(StackPtr stack)            //清空
{
    if(stack == NULL)exit(0);
    stack->top = 0;
    return true;
}

int Destroy_Stack(StackPtr stack)          //销毁
{
    if(stack == NULL)exit(0);
    free(stack->data);
    stack->data = NULL;
    stack->top = 0;
    stack->stacksize = 0;
    return true;
}

//------------------------------------------------------

//--------------------逆波兰式实现------------------------

int OperPre(char oper)         //处理优先级
{
    int tmp;
    switch(oper)
    {
    case '+':
    case '-':
      tmp = 1; break;
    case '*':
    case '/':
      tmp = 2;break;
    default:
      tmp = 3;
    }
    return tmp;
}

void RPNotation(char *buff)         //逆波兰式实现
{
    Stack s1,s2;                  //定义两个栈是s1,s2
    Init_Stack(&s1);                //初始化栈
    Init_Stack(&s2);

    while(1)                        //逆波兰实现
    {
      if(isdigit(*buff))         //将数字存入s2
      {
            Push_Stack(&s2,*buff);

      }

      if(!isdigit(*buff))
      {
            while(OperPre(*buff)<=OperPre(GetTop(&s1)))
            {
                if(s1.top == 0) break;          //若s1没数据则直接入栈
                if(GetTop(&s1)=='(')break;    //处理‘(’问题
                Push_Stack(&s2,GetTop(&s1));    //将s1的栈顶压入s2
                Pop_Stack(&s1);               //s1出栈
            }

            if(*buff != ')')                  //若出现‘)’则交给下一个if条件语句处理
            {
                Push_Stack(&s1,*buff);
            }
      }

      if(*buff == ')')                   //处理‘(’,‘)’问题
      {
            while(GetTop(&s1) != '(')      //将‘(’之前的运算符压入s2中
            {
                Push_Stack(&s2,GetTop(&s1));
                Pop_Stack(&s1);
            }
            Pop_Stack(&s1);               //运算符处理完后,将‘(’出栈
      }

      buff++;
      if(*buff == '\n') break;            //结束条件
    }



   while(s2.top != 0)                     //将(栈)s2压入(栈)s1
      {
                Push_Stack(&s1,GetTop(&s2));
                Pop_Stack(&s2);
      }
    //==============================================================
      char op;

    while(s1.top != 0)

      {      op=GetTop(&s1);
                  int num1,num2,sum;
               if(isdigit(op) )
               {
                     Push_Stack(&s2,GetTop(&s1)-48);
                     Pop_Stack(&s1);



               }
               else
               {
                   if(op=='+')
               {
                  Pop_Stack(&s1);
                  num1 = GetTop(&s2);
                  Pop_Stack(&s2);

                  num2 = GetTop(&s2);
                  Pop_Stack(&s2);
                  sum=num1+num2;
                  Push_Stack(&s2,sum);


                }

               else if (op=='-')
               {
                  Pop_Stack(&s1);
                  num1 = GetTop(&s2);
                  Pop_Stack(&s2);
                  num2 = GetTop(&s2);
                  Pop_Stack(&s2);
                  sum=num1-num2;
                  Push_Stack(&s2,sum);



               }


               else if (op=='*')
               {
                  Pop_Stack(&s1);
                  num1 = GetTop(&s2);
                  Pop_Stack(&s2);
                  num2 = GetTop(&s2);
                  Pop_Stack(&s2);
                  sum=num1*num2;
                  Push_Stack(&s2,sum);


               }


            else if (op=='/')
               {
                  Pop_Stack(&s1);
                  num1 = GetTop(&s2);
                  Pop_Stack(&s2);
                  num2 = GetTop(&s2);
                  Pop_Stack(&s2);
                  sum=num1/num2;
                  Push_Stack(&s2,sum);


                }
               }



      }

      while(s2.top != 0)
         {
      printf("%d",(int)GetTop(&s2));
      Pop_Stack(&s2);

         }

}

int main()
{
    char buff;
    printf("中缀表达式:\n");
    fgets(buff,127,stdin);
    RPNotation(buff);
    return 0;
}

DEATHTOUCH 发表于 2021-11-13 23:28

学数据结构?

typedef char ElemType;

#define STACKSIZE 50

typedef struct Stack
{
    ElemType*data;
    ElemTypetop;
    int stacksize;
}*StackPtr;
这里你的类型是 char,你读取了字符串里的数字字符放进栈里,那栈里面的 '8' 其实转成 int 是 56
所以要减掉 48 才是真正的数字 8

nug 发表于 2021-11-14 03:19

参考ascii对照表,一个是字符 1,一个是字符对应的整数

字符减去48 也是一种把字符转换整数的一种常见做法~

页: [1]
查看完整版本: 求助大佬问题,谢谢:C语言,栈,有一块代码计算1+1,压进栈的时候我输出为什么是49