反向波兰转换器

时间:2015-02-11 16:19:51

标签: c reverse postfix-notation rpn

我正在尝试制作可以执行以下操作的反向波兰打印机 -

输入:

  1. (a+(b*c))
  2. ((a+b)*(z+x))
  3. ((a+t)*((b+(a+c))^(c+d)))
  4. 输出:

    1. abc*+
    2. ab+zx+*
    3. at+bac++cd+^*
    4. 这是我的代码:

      #include <stdio.h>
      #include <string.h>
      char pop(int t);
      void push(int c, int t);
      int main()
      {
          int z;
          scanf("%d", &z);
          char *a[100];
          int i = 0;
          int q = z;
          while (q-- > 0)
          {
              char v[400];
              scanf("%s", &v);
              int t;
              for (t = 0; t < strlen(v); t++)    //loop to put the values and signs in the 2 stacks
              {
                  if ((v[t] == '*') || (v[t] == '+') || (v[t] == '-') || (v[t] == '^'))
                  {
                      push(v[t], 2);
      
      
                  }
      
                  else if (v[t] == ')')
                  {
                      int y = pop(2);
                      push(y, 1);
      
                  }
      
                  else
                  {
                      push(v[t], 1);
      
                  }
              }
              int k = 0;
              char c;
              while ((c = pop(1)) !='\0')    //loop to put elements in the array v
              {
      
                  if (c != '(')
                  {
      
                      v[k++] = c;
      
                  }
              }
              v[k--] = '\0';
              int m;
              for (m=0; m != k; m++, k--)     //for reversing the string
              {
                  char t = v[m];
                  v[m] = v[k];
                  v[k] = t;
              }
      
              a[i++] =v;
              printf("%s",a[i - 1]);
          }
          int p;
          for (p = 0; p <z ; p++)   //printing the elements
              printf("%s\n",*a[p]);
          return 0;
      }
      char ac[400];
      char as[400];
      int ic = 0;
      int is = 0;
      void push(int c,int t)
      {
          if (t == 1 && ic != 400)
              ac[ic++] = c;
          else if (t == 2 && is != 400)
              as[is++] = c;
      }
      char pop(int t)
      {
          if (t == 1 && ic != 0)
              return ac[--ic];
          if (t == 2 && is != 0)
              return as[--is];
          return '\0';
      }
      

      但它甚至没有正确输入,我无法弄清楚这段代码中的错误。请帮助弄清楚有什么问题。

1 个答案:

答案 0 :(得分:0)

  

在输入no测试用例ieint z和第一行输入后输入   它崩溃了

这是由于

        printf("%s\n",*a[p]);

正如BLUEPIXY注意到的那样, *a[p]char ;但%s需要char *,因此您需要

        printf("%s\n", a[p]);

并且关于 v超出范围,关键因素不是范围(可见性),而是v的存储持续时间(生命周期) - 其生命周期结束当与之关联的块的执行结束时,指针a[i]的值变为不确定;通过改变

        a[i++] =v;

        a[i++] = strdup(v);

你可以解决这个问题。