后缀表示法 - 堆栈弹出和推送帮助,为mod或pow操作员返回不正确的返回值

时间:2014-07-01 07:44:59

标签: c return-value postfix-notation postfix-operator

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

命令行参数:" 2 2 +"应该等于4。

#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);
            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);
            b = pop(&ph);
            val = pow(a,b);
            push(&ph, val);
        }

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

        else {
            push(&ph, atoi(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;
}

我已经尝试过&#34; 2 2 +&#34;并且它已经工作了,所以它已经评估为8.然后出现了这个问题,其中&#34; 2 4 ^ 2 * 5%2 - &#34;它应该评估为0但我得-2。这里的缺陷是什么?

1 个答案:

答案 0 :(得分:3)

如评论中所写:你必须把*放在“,否则它将扩展到当前文件夹中的所有文件。所以用它来调用

 ./a.out 2 4 ^ 2 "*" 5 % 2 -

它会起作用