后缀表示法 - 堆栈弹出和推送帮助,打印内存地址而不是实际数字

时间:2014-07-01 06:13:47

标签: c stack command-line-arguments postfix-notation

我的代码在它的目标中相对简单,它接受命令行参数并相应地放置堆栈。

命令行参数:" 2 2 +"

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

  typedef struct stack {

     int top;
     int items[100];

  } stack;

  void initializeStack(stack* p);
  void push(stack* p, int val);
  int pop(stack* p);

  int main(int argc, char** argv) {

      int i, a, b;
      int val = 0;
      stack ph;
      initializeStack(&ph);

      for(i=1; i<argc; i++) {
          if(strcmp(argv[i], "*") == 0) {
              a = pop(&ph);
              b = pop(&ph);
              val = a*b;
              push(&ph, val);
          }

          else if(strcmp(argv[i], "/") == 0) {
              a = pop(&ph);
              b = pop(&ph);
              val = b/a;
              push(&ph, val);
          }

          else if(strcmp(argv[i], "+") == 0) {
              a = pop(&ph);
              printf("%d\n", a);
              b = pop(&ph);
              printf("%d\n", b);
              val = a+b;
              push(&ph, val);
          }

          else if(strcmp(argv[i], "-") == 0) {
              a = pop(&ph);
              b = pop(&ph);
              val = b-a;
              push(&ph, val);
          }

          else if(strcmp(argv[i], "^") == 0) {
              a = pop(&ph);
              b = pop(&ph);
              val = pow(b,a);
              push(&ph, val);
          }

          else if(strcmp(argv[i], "%") == 0) {
              a = pop(&ph);
              b = pop(&ph);
              val = b%a;
              push(&ph, val);
          }

          else {
              push(&ph, argv[i]);
          }
      }

      printf("%d\n", pop(&ph));

      return 0;
  }

  void initializeStack(stack* p) {
      p->top = 0;
  }

  void push(stack* p, int val) {
      p->top++;
      p->items[p->top] = val;
  }

  int pop(stack* p) {
      int y;
      y = p->items[p->top];
      p->items[p->top] = 0;
      (p->top)--;
      return y;
  }

我在我的else if语句中添加了printf语句以及最后的pop,但如果我运行,我得到这个输出:

6956340 6956337 13912677

这让我相信它打印内存地址而不是传入的实际值。

编写代码的正确方法是什么?如果&#34; 2 2 +&#34;是我的代码参数,答案是4,或者我当前的printf语句将成为&#34; 2 2 4&#34;?

3 个答案:

答案 0 :(得分:1)

argv[i]是一个字符串(char*)而不是一个int,但是你把它传递给push(),好像它是一个int。

在将其推入堆栈之前,您需要将其转换为int(可能通过atoi())。或者您可以更改push以获取字符串并将其转换为其中的int。

答案 1 :(得分:1)

argv [i]是const char *。你推(&amp; ph,argv [i]);使用atoi转换为int。

答案 2 :(得分:1)

你是对的。通过push(&ph, argv[i]将argv []字符串的地址推送到堆栈。 您应该push(&ph, atoi(argv[i])代替。