-1

コードに問題があります。1桁のintでのみ機能するようです。9 より大きい int に対して機能する関数を作成する方法がわかりません。また、文字列が空の場合にプログラムを終了する方法もわかりません。

これが私のコードです:

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

//stack type
struct node
{
    int head;
    int *array;
    unsigned capacity;
};

struct node* createNode();
int isEmpty();
char pop();
void push(struct node* stack, char op);
int evaluatePostfix();

int main()    {
    char exp[1000]; // = "5 1 2 + 4 * + 3 -";
    printf("Input string:\t");
    fgets(exp, 1000, stdin);
    for(int i = 1 ; i <= strlen(exp); i++) {
        if(exp[i] == '\n') {
            exp[i] = '\0';
        }
        else if (exp[0] == '\n') {
            printf("stack is empty\n");
            exit(0);
        }
    }
    printf ("%s = %d\n", exp, evaluatePostfix(exp));
    return 0;
}

struct node* createNode(unsigned capacity)  {
    struct node* stack = (struct node*) malloc(sizeof(struct node));

    if (!stack) return NULL;

    (*stack).head = -1;
    (*stack).capacity = capacity;
    (*stack).array = (int*) malloc((*stack).capacity *sizeof(int));

    if (!(*stack).array) return NULL;

    return stack;
}

int isEmpty(struct node *stack) {
    return (*stack).head == -1 ;
}


char pop(struct node* stack)    {
    if (!isEmpty(stack))
    return (*stack).array[(*stack).head--] ;
    return '$';
}


void push(struct node* stack, char op)  {
    (*stack).array[++(*stack).head] = op;
}

// The main function that returns value of a given postfix expression 
int evaluatePostfix(char* exp)  {

// Create a stack of capacity equal to expression size
    struct Stack* stack = createStack(strlen(exp));
    struct node *stack = createNode(strlen(exp));
    if (!stack) return -1;

// Scan all characters one by one

for (int i = 0; exp[i]; ++i){
    // If the scanned character is an operand or number,
    // push it to the stack.    
   if ((exp[i])== ' ') continue;
   else if (isdigit(exp[i]))
        push(stack, exp[i] - '0');


    //  If the scanned character is an operator, pop two
    // elements from stack apply the operator 
    else
    {
        int val1 = pop(stack);
        int val2 = pop(stack);
        switch (exp[i])
        {
         case '+': push(stack, val2 + val1); break;
         case '-': push(stack, val2 - val1); break;
         case '*': push(stack, val2 * val1); break;
         case '/': push(stack, val2/val1);   break;
        }
    }
}
return pop(stack);
}
4

1 に答える 1

0

私はあなたのためにすべてを書くことはできませんが、あなたを正しい方向に向けることはできます. まず、誰かが「ライブラリ関数 XYZ() が役に立つだろう」と言ったら、マニュアルページでその関数について読んでください。たとえば、Linux シェルから次のコマンドを実行man atoiして、関数について確認しatoiます。

特定の問題については、文字列を解析して数値と演算子に変換することになります。したがって、いくつかの役立つライブラリ関数は次のようになります。

  • strtok: 長い文字列から区切られた文字列トークンを抽出します。これを使用して、個別の入力をそれぞれ取得できます。
  • atoi: これは、数値の文字列表現をそれに相当する整数に変換できます。エラーチェックを許可しません。
  • strtol: と同じatoi(およびそれ以上の) ことができ、エラー チェックも可能です。

その情報を念頭に置いて、役に立つかもしれないコード スニペットを次に示します。

int evaluatePostfix(char* exp)
{
    char *token;
    long int number;

    /* strtok will keep extracting the next token delimited by space */
    while (token = strtok(exp, " ")) {

        /* Now parse the token and process it */
        if (is_operator(token)) {
            /* do operator processing */
        } else {
            number = strtol(token, NULL, 10);
            /* do number processing */
        }
    }

    /* strtok returns NULL when no more tokens. So
       we are done when the while loop exits */
}

上記のコードは のエラー チェックを行わないことに注意してくださいstrtol。あなたはおそらくそれをしたいでしょう。のマニュアル ページを読んで、strtolエラー チェックがどのように行われるかを理解してください。

于 2015-05-04T03:23:09.760 に答える